Python面试题之copy/deepcopy详解

copy和deepcopy有什么区别?

http://blog.csdn.net/qq_32907349/article/details/52190796

http://iaman.actor/blog/2016/04/17/copy-in-python

我们寻常意义的复制就是深复制,即将被复制对象完全再复制一遍作为独立的新个体单独存在。所以改变原有被复制对象不会对已经复制出来的新对象产生影响。
而浅复制并不会产生一个独立的对象单独存在,他只是将原有的数据块打上一个新标签,所以当其中一个标签被改变的时候,数据块就会发生变化,另一个标签也会随之改变。这就和我们寻常意义上的复制有所不同了。

对于简单的 object,用 shallow copy 和 deep copy 没区别

复杂的 object, 如 list 中套着 list 的情况,shallow copy 中的 子list,并未从原 object 真的「独立」出来。也就是说,如果你改变原 object 的子 list 中的一个元素,你的 copy 就会跟着一起变。这跟我们直觉上对「复制」的理解不同。


import copy
# a = 123
# b = 123
# c = a
# print(id(a))
# print(id(b))
# print(id(c))
# 1345408560
# 1345408560
# 1345408560

# a1 = copy.copy(a)
# a2 = copy.deepcopy(a)
# print(id(a1))
# print(id(a2))
# 1345408560
# 1345408560


# n1 = {'k1':123,'k2':'abc','k3':[1,'bv']}
# # n2 = n1
# n2 = copy.copy(n1)
# # n2 = copy.deepcopy(n1)
# print(id(n1))
# print(id(n2))
# n2['k3'][0] = 3
# print(n2)
# print(n1)
# print(id(n1))
# print(id(n2))
# 16596928
# 16642096
# {'k1': 123, 'k2': 'abc', 'k3': [3, 'bv']}
# {'k1': 123, 'k2': 'abc', 'k3': [3, 'bv']}
# 16596928
# 16642096


# n1 = {'k1':123,'k2':'abc','k3':[1,'bv']}
# n2 = n1
# n2 = copy.copy(n1)
# n2 = copy.deepcopy(n1)
# print(id(n1))
# print(id(n2))
# n2['k3'][0] = 3
# print(n2)
# print(n1)
# print(id(n1))
# print(id(n2))
# print(id(n1['k3']))
# print(id(n2['k3']))
# 51986368
# 53434384
# {'k1': 123, 'k2': 'abc', 'k3': [3, 'bv']}
# {'k1': 123, 'k2': 'abc', 'k3': [1, 'bv']}
# 51986368
# 53434384
# 53427456
# 53427496

dic = {
'cpu':[80,],
'mem':[80,],
'hdd':[80,],
}

new_dic = copy.deepcopy(dic)
print(dic)
print(new_dic)
# {'cpu': [80], 'mem': [80], 'hdd': [80]}
# {'cpu': [80], 'mem': [80], 'hdd': [80]}
print("*"*60)
new_dic['cpu'][0] = 70
print(dic)
print(new_dic)

# new_dic = copy.copy(dic)
# {'cpu': [80], 'mem': [80], 'hdd': [80]}
# {'cpu': [80], 'mem': [80], 'hdd': [80]}
# ************************************************************
# {'cpu': [70], 'mem': [80], 'hdd': [80]}
# {'cpu': [70], 'mem': [80], 'hdd': [80]}


# new_dic = copy.deepcopy(dic)
# {'cpu': [80], 'mem': [80], 'hdd': [80]}
# {'cpu': [80], 'mem': [80], 'hdd': [80]}
# ************************************************************
# {'cpu': [80], 'mem': [80], 'hdd': [80]}
# {'cpu': [70], 'mem': [80], 'hdd': [80]}
 
原文地址:https://www.cnblogs.com/william126/p/7107473.html