C变量是值的容器,用于保存相应的值。
Python 也有变量和值的概念,但是值是独立的对象,而变量是用来标识(引用)对象的。对象有类型,不同对象的大小也不同,我们不需要知道对象的大小,只需要根据对象的类型正确使用,如果某个对象不用了,python会有回收机制将其回收。
id(1)
>>140723104982832
a=1
id(a)
>>140723104982832
变量的赋值和共享:
两个变量之间进行赋值,等同于两个变量共享(引用)同一个对象
b=a ##不可变对象情况
id(b)
>>140723104982832
c=[1,2,3] ##列表是一个可变对象
d=c
id(c)
>>3113652251584
id(d)
>>3113652251584
c.append(4)
c
>>[1, 2, 3, 4]
id(c)
>>3113652251584
d
>>[1, 2, 3, 4]
id(d)
>>3113652251584
c=c+[5] #对列表进行+操作会生成新对象
id(c)
>>3113652144000
z=[1,2,3,4]
id(z)
>>3113652295232
拷贝和共享
表拷贝是构造另一个“同样”的表,但是只拷贝表的一层,如果表中的元素是不可变对象那么共享元素不会带来问题,如果拷贝表中的元素是可变对象,则需要深度拷贝。
a1=[[i+j for i in range(3)] for j in range(3)]
a1
>>[[0, 1, 2], [1, 2, 3], [2, 3, 4]]
a2=a1.copy()
a1[0][0]=5
a1
>>[[5, 1, 2], [1, 2, 3], [2, 3, 4]]
a2
>>[[5, 1, 2], [1, 2, 3], [2, 3, 4]]
##解决方案 一层层复制
a1=[[i+j for i in range(3)] for j in range(3)]
a3=[[x for x in vec] for vec in a1]
a3
>>[[0, 1, 2], [1, 2, 3], [2, 3, 4]]
##深度copy
import copy
a4=copy.deepcopy(a1)
a4
>>[[0, 1, 2], [1, 2, 3], [2, 3, 4]]
a1[0][0]=5
a1
>>[[5, 1, 2], [1, 2, 3], [2, 3, 4]]
a3
>>[[0, 1, 2], [1, 2, 3], [2, 3, 4]]
a4
>>[[0, 1, 2], [1, 2, 3], [2, 3, 4]]