美文网首页
python中的对象、变量、引用的问题

python中的对象、变量、引用的问题

作者: Old_Artist | 来源:发表于2020-01-13 12:29 被阅读0次

对象、变量、引用

对象

对象包括 不可变对象 和 可变对象。但从某种意义上来说,可变和不可变并不是对立关系。
int,string,float,tuple 这四类属于 不可变对象。这里不可变的含义是:对象的地址不可变,内存地址与该对象为一一对应关系。
list, dict 这两类属于 可变对象。这里可变的含义是:可变对象由不可变对象构成,可变对象自身的物理地址不可改变,但构成它的不变对象可以被替换
以两个int对象为例,先来看一个例子:
···
def check_const_variable():
x = 77
y = x

经过上两步操作,x和y现在均指向储存对象77的内存地址 38076456

print('x id:' + str(id(x))) #38076456
print('y id:' + str(id(y))) #38076456

对x进行重新赋值,x指向储存对象69的内存地址 38074656

x = 69
print('x id:' + str(id(x))) #38074656

检查y,发现y仍然指向38076456,说明77这个对象没有被改变

print('y id:' + str(id(y))) #38076456

z = [77]
w = z

经过上两步操作,z和w现在均指向储存对象[77]的内存地址 39114944,z的第一个元素地址38074656

print('z id:' + str(id(z))) #39114944
print('w id:' + str(id(w))) #39114944
print('z first element id:' + str(id(z[0]))) #38074656

对z的第一个元素进行重新赋值,z从内容上来已经是一个新的列表,但是它的物理地址没变。而此时z的第一个元素已经被替换。

z[0] = 65
print('z first element id:' + str(id(z[0]))) #38074752

再检查w,发现w仍然指向39114944,说明[77]这个对象的地址没有被改变,w一直指向它。

print('w id:' + str(id(w))) #39114944
print('w first element id:' + str(id(w[0]))) #38074752
···

变量 和 引用

-变量是一个系统表的元素,拥有指向对象的连接的空间。
-引用是自动形成的从变量到对象的指针
···
x = 69 #x是一个变量,69是一个不可变对象,x中储存了69这个不可变对象的内存地址
y = [69,33,44] #y是一个变量,[69]是一个可变对象,y中储存了[69]这个不可变对象的内存地址
print id(x) #38074656
print id(y) #39115016
print id(y[0]) #38074656
···
从上面的例子可以看到,x和y的关系是:y->39115016->[38074656,...,...]<-[x,...,...]
而其中的 箭头->,就表示引用

创建对象

不可变对象的创建后,相同内容的不可变变量 在同一个进程中内存地址是相同的

···
x = 100
y = 'hello'
z = 156.0
y = 100
print id(x) #38075904
print id(y) #38075904
···
也就是说在这个进程中,无论创建几个100整形变量,它的地址都是38075904。

可变对象创建后,相同内容的可变变量 在同一个进程中内存地址是不同的

···
xx = [100]
yy = [100]
print id(xx) #39115016
print id(yy) #39115376
···

复制对象

-当把一个对象赋给一个数据结构元素或者变量名时,python总是会存储对象的引用,而不是对象的一个拷贝。
-字符串方法都生成了新的字符串对象。

相关文章

  • 引用的本质:栈内存和堆内存

    在python中,变量:对象的引用。因为,变量存储的就是对象的地址,变量通过地址引用了‘对象’。 变量位于:栈内存...

  • day20

      1.python中变量的赋值   python中所有的数据都是对象,所有的变量都是对象的引用  python对...

  • python中的对象、变量、引用的问题

    对象、变量、引用 对象 对象包括 不可变对象 和 可变对象。但从某种意义上来说,可变和不可变并不是对立关系。int...

  • day20-python中的内存管理机制

    1、python中变量的赋值a、python中所有的数据都是对象,所有的变量都是对象的引用。b、python对数字...

  • 2018-09-14 day20-内存管理机制

    python中变量的赋值 python中所有的数据都是对象,所有的变量都是对象的引用 python对数字、字符串(...

  • 2018-09-14内存管理机制(day20)

    1.python中变量的赋值 python中所有的数据都是对象,所有的变量都是对象的引用 python对数字、布尔...

  • 内存管理机制

    1.python中变量的赋值 python中所有的数据都是对象,所有的变量都是对象的引用python对数字,字符串...

  • 2018-09-15 day20-内存管理

    1.python中变量的赋值 python中所有的数据都是对象,所有的变量都是对象的引用python对数字,字符串...

  • 2018-09-14-day20python内存管理机制

    1.python中变量的赋值 python中所有的数据都是对象,所有的变量都是对象对应的引用a = int()py...

  • 变量(引用)的使用与删除、常量

    变量 变量就是对象的引用,即变量通过地址引用了“对象” 变量位于栈内存;对象位于堆内存 *python是动态类型语...

网友评论

      本文标题:python中的对象、变量、引用的问题

      本文链接:https://www.haomeiwen.com/subject/jumgactx.html