昨天在刷Leetcode时,遇到下面一个问题:
t = [0 for i in range(3)]
M = [t for i in range(3)]
print(M)
M[0][0]+=1
print(M)
最后的结果却为[[1,0,0],[1,0,0],[1,0,0]],通过询问才知道变量和对象。虽然以前在C++中学过变量和对象,但是在python中基本没使用过。下面记录一下对变量和对象的学习:
学习python首先要了解这些词的关系:变量,对象,引用,类型。其中类型存在于对象,变量通过引用连接上对象。变量在赋值的时候才会创建,可以引用任何类型的对象。
以a=1为例,其中a为变量,1为对象,变量a通过引用连接上对象1.变量实际上是到对象内存空间的一个指针,变量是一个系统表的元素,拥有指向对象的连接空间。对象是分配的一块内存,有足够的空间去表示他们所代表的的值,引用是自动形成的从变量到对象的指针。
此外,对象又可分为可变对象和不可变对象:
1.可变对象:该对象对应的内存中的值可以被改变,因此变量改变后,该对象也被改变,即原地改变,如:list,dict,set
2.不可变对象:该对象对应内存中的值不会变,因此如果指向该对象的变量被改变了,会重新开辟一个地址,变量再指向这个新地址,如:int,float,str,tuple。
学习完这些知识,就我个人理解对一开始的程序做一个解释:
t = [0 for i in range(3)]
t为变量,[0,0,0]为对象
M = [t for i in range(3)]
M为变量,[t,t,t]为对象
因此就形成了下面这种关系:
故在改变其中一个t时,三个t都会发生改变。