浅拷贝
1.=浅拷贝
=浅拷贝相当于引用,直接进行赋值,原对象改变,则被赋值的对象也会有相同的改变。
a = [1, 2, 3, 4, ['a', 'b'], {"one": "1", "two": "2"}, ("1","2")]
b = a
print(a) # [1, 2, 3, 4, ['a', 'b'], {'one': '1', 'two': '2'}, ('1', '2')]
print(b) # [1, 2, 3, 4, ['a', 'b'], {'one': '1', 'two': '2'}, ('1', '2')]
a.append(5)
print(id(a)) # 2899538518152
print(id(b)) # 2899538518152
当然这个id值是会变化的,你每次运行程序,可能id都会变化
2.copy浅拷贝
使用copy模块中的copy函数进行浅拷贝,对原对象进行复制,整体使用的是新的对象地址,但是其内部子对象,使用的还是原对象中的子对象的地址,并且,如果该子对象是个不可变对象,例如:元组、数值和字符串,在对该子对象修改后,浅拷贝的中的子对象不会发生改变,但是如果该子对象是个可变对象,例如:列表,字典和集合,则会在子对象修改后,发生改变。
a = [1, 2, 3, 4, ['a', 'b'], {"one": "1", "two": "2"}, ("1","2")]
b = copy.copy(a)
a.append(5)
a[4].append("c")
print(a) # [1, 2, 3, 4, ['a', 'b', 'c'], {'one': '1', 'two': '2'}, ('1', '2'), 5]
print(b) # [1, 2, 3, 4, ['a', 'b', 'c'], {'one': '1', 'two': '2'}, ('1', '2')]
a[6] = ("1","2","3")
print(a) # [1, 2, 3, 4, ['a', 'b', 'c'], {'one': '1', 'two': '2'}, ('1', '2', '3'), 5]
print(b) # [1, 2, 3, 4, ['a', 'b', 'c'], {'one': '1', 'two': '2'}, ('1', '2')]
print(id(a)) # 2326873163144
print(id(b)) # 2326873162440
深拷贝
深拷贝则更加严格,则是完全进行拷贝,重新创建了一个对象,并且复制了原对象的值。对原对象进行修改,也不会影响到新对象。
a = [1, 2, 3, 4, ['a', 'b'], {"one": "1", "two": "2"}, ("1","2")]
c = copy.deepcopy(a)
a.append(5)
a[4].append("c")
print(a) # [1, 2, 3, 4, ['a', 'b', 'c'], {'one': '1', 'two': '2'}, ('1', '2'), 5]
print(c) # [1, 2, 3, 4, ['a', 'b'], {'one': '1', 'two': '2'}, ('1', '2')]
a[6] = ("1","2","3")
print(a) # [1, 2, 3, 4, ['a', 'b', 'c'], {'one': '1', 'two': '2'}, ('1', '2', '3'), 5]
print(c) # [1, 2, 3, 4, ['a', 'b'], {'one': '1', 'two': '2'}, ('1', '2')]
print(id(a)) # 2326873163144
print(id(c)) # 2326873165704
总结:
- 如果只是想使用相同的值,但是不需要考虑原对象是否收到新对象修改的影响时,可以选择直接使用等号来进行浅拷贝。
- 如果想对新对象修改的同时不影响原对象,并且原对象中无可变子对象,则可以使用copy模块中的copy方法。
- 如果原对象中有可变子对象,又想进行第二部的操作,可以直接使用copy模块中的deepcopy方法。