先看一段程序
import copy
a = [1, 2, 3]
b = [1, 2, 3, a] # [1, 2, 3, [1, 2, 3]]
x = b # 直接赋值
y = b.copy() # 浅拷贝
z = copy.deepcopy(b) # 深拷贝
# 先对b做直接修改
b.append(111)
print("x: %s" % x, "y: %s" % y, "z: %s" % z, sep="\n")
# x: [1, 2, 3, [1, 2, 3], 111]
# y: [1, 2, 3, [1, 2, 3]]
# z: [1, 2, 3, [1, 2, 3]]
# 再对b内的子对象a做修改
a.append(125)
print("x: %s" % x, "y: %s" % y, "z: %s" % z, sep="\n")
# x: [1, 2, 3, [1, 2, 3, 125], 111]
# y: [1, 2, 3, [1, 2, 3, 125]]
# z: [1, 2, 3, [1, 2, 3]]
直接赋值
在python中,对象赋值实际上是对象的引用。当创建一个对象,然后把它赋给另一个变量的时候,python并没有拷贝这个对象,而只是拷贝了这个对象的引用,实际上指向的还是同一个对象
浅拷贝
拷贝父对象,但不会拷贝对象内部的子对象,也就是只复制可变对象b本身,内部的可变对象a还指向同一个
深拷贝
会在内存中复制出一个新的对象
网友评论