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

对象、变量、引用

对象

对象包括 不可变对象 和 可变对象。但从某种意义上来说,可变和不可变并不是对立关系。
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中的对象、变量、引用的问题)