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就是把对象完全复制一遍放在一个新的内存单元中,你可以对复制后的东西任意操作而不会影响原对象

发布了78 篇原创文章 · 获赞 20 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/qq_43657442/article/details/103575290