之前对Python的拷贝和赋值一直很疑惑,今天认真研究了一下,终于弄明白了。
Python的复制操作为了高效,赋值右面的操作数是字面值,如字符串或数字,那么右面的操作数被设置为一个对象引用,该对象引用将指向存放字面值的内存对象。
a=123
b=a
a=321
print(a) # 321
print(b) #123
如果赋值右面是对象引用,那么左面的操作数将设置为一个对象引用,并与右面的操作数指向同一个对象。
class MyClass(object):
a=123
class1 = MyClass()
class2 = class1
class1.a=321
print(class1.a) # 321
print(class2.a) # 321
对象引用

因为class1和class2指向的是同一对象,所以class1.a改变时,class2就会改变
拷贝分为浅拷贝和深拷贝
字典和集合通过copy()函数可以返回对象副本。从外copy模块也提供了copy.copy()函数,返回给定对象副本。
class3=copy.copy(class1)
class1.a=456
print(class1.a) # 456
print(class3.a) # 321
如果属性是对象引用,那么浅拷贝没有拷贝属性的对象副本,只能通过深拷贝,将内部所有的对象拷贝新的副本,仅限于组合数据类型。如果向上面自定义的类深度拷贝也是不行的,需要重写类的__deepcopy__函数。
第一次写博客,有什么错误希望大家多多指正,谢谢!

164

被折叠的 条评论
为什么被折叠?



