python 里面的=和copy的区别
目的:我想要的是把对象完全复制一遍放在一个新的内存单元中,二者相互独立。
赋值(=)与复制(copy)在c++里面是一致的的,在Python里面似乎不同。先说说赋值(=),如a=[1, 2, 3]
。这句话是什么意思呢,可以理解为把 [1, 2, 3] 看成一个物品。a = [1, 2, 3] 就相当于给这个物品上贴上 a 这个标签。b = a
就是给这个物品又贴上了一个 b 的标签。那么其实a和b指向的都是同一个地址,这个地址的内容是[1, 2, 3]
,改变其中一个就会影响另一个。这与我的目的不符。
a=[1,2,3] #等号赋值相当于把a的地址赋给了b,现在a和b一起指向【1,2,3】这个列表
b=a
id(a) == id(b)) #ture,id()函数获得内存地址,二者地址相同
#—————————————因为指向相同,修改其中一个的内容就会影响另一个内容,a,b都会改变—————————————————————
a[0]=7
print(a) #[7, 2, 3]
print(b) #[7, 2, 3]
#如果a又指向了一个新的列表,那么a的地址会变,但b还是指向原本的列表
a=[4,5,6]
print(a) #[4, 5, 6]
print(b) #[7, 2, 3]
id(a) == id(b)) #FALSE,二者的地址已经不再相同了
a = [4, 5, 6] 就相当于把 a 标签从 [7 ,2, 3] 上撕下来,贴到了 [4, 5, 6] 上,a的地址改变了。在这个过程中,[7, 2, 3] 这个物品并没有消失。 b 自始至终都好好的贴在 [7, 2, 3] 上,所以 b 的地址自然不变。
复制(copy)一般指深复制,即将被复制对象完全再复制一遍作为独立的新个体单独存在。所以改变原有被复制对象不会对已经复制出来的新对象产生影响。
a=[1,2,3]
b=copy.copy(a) #copy进行复制后为两个独立的对象
id(a) == id(b)) #FALSE,a b是两个独立的对象,有自己的内存空间。他们的地址已经不再相同了
a[0]=10 #这时改变a,是不会影响b的
print(a) #[10, 2, 3]
print(b) #[1, 2, 3]
我理解的copy就是把对象完全复制一遍放在一个新的内存单元中,你可以对复制后的东西任意操作而不会影响原对象