• 直接赋值:其实就是对象的引用(别名)。
  • 浅拷贝(copy):拷贝父对象,不会拷贝对象的内部的子对象。
  • 深拷贝(deepcopy): copy 模块的 deepcopy 方法,完全拷贝了父对象及其子对象。

列表拷贝示例说明:

import copy
a = [1,2,3,[4,5,6]]
b = a                 # 浅拷贝: 引用对象
c = a.copy()          # 浅拷贝:深拷贝父对象(一级目录),子对象(二级目录)不拷贝,还是引用
d = copy.deepcopy(a)  # 深拷贝,包含对象里面的自对象的拷贝,所以原始对象的改变不会造成深拷贝里任何子元素的改变

a.append('AA')
a[3].append('BB')

print("a:", a)
print("b:", b)
print("c:", c)
print("d:", d)

输出:

a: [1, 2, 3, [4, 5, 6, 'BB'], 'AA']
b: [1, 2, 3, [4, 5, 6, 'BB'], 'AA']
c: [1, 2, 3, [4, 5, 6, 'BB']]
d: [1, 2, 3, [4, 5, 6]]

字典拷贝示例说明:

import copy
dict1 = {
   'user': 'A',
         'num': [1, 2, 3]}

dict2 = dict1         # 浅拷贝: 引用对象
dict3 = dict1.copy()  # 浅拷贝:深拷贝父对象(一级目录),子对象(二级目录)不拷贝,还是引用
dict4 = copy.deepcopy(dict1)

dict1['user'] = 'BBB'
dict1['num'].remove(1)

# 输出结果
print("dict1: ", dict1)
print("dict2: ", dict2)
print("dict3: ", dict3)
print("dict4: ", dict4)

输出:

dict1:  {'user': 'BBB', 'num': [2, 3]}
dict2:  {'user': 'BBB', 'num': [2, 3]}
dict3:  {'user': 'A', 'num': [2, 3]}
dict4:  {'user': 'A', 'num': [1, 2, 3]}