import copy
def test_copy_func():
x=[1,5,[4,5]]
print(type(x),'id x=',id(x),type(x[2]),"id[2]=",id(x[2]),"id[0]=",id(x[0]),'id int 1=',id(1))
y=x #是贴了两个标签的效果, y is x=true
print(type(y),'id y=',id(y),"id[2]=",id(y[2]),"id[0]=",id(y[0]))
y[0]=2
y[2][0]=0
print("再次输出x",type(x),'id x=',id(x),"id[2]=",id(x[2]),"id[0]=",id(x[0]),"id int 2=",id(2))
print("y=x,y is x?",y is x)
w=copy.copy(x) #新开辟了一个存储空间;只拷贝顶级对象,嵌套对象仍然是标签效果,会改变源数据;w is not x;
print(type(w),'id w=',id(w),"id[2]=",id(w[2]),"id[0]=",id(w[0]))
print("w=copy.copy(x),w is x?",w is x)
w[0]=1
print("w=copy.copy(x),w[2] is x[2]?",w[2] is x[2])
w[2][0]+=1
#deepcopy会对所有嵌套对象开辟新存储空间
z=copy.deepcopy(x)
z[2][0]=1
print(type(z),id(z),"id[2]=",id(z[2]))
print("z=copy.deepcopy(x),z[2] is x[2]?",z[2] is x[2])
#以上问题的总结试题
a = [1,2,3,[4,5],6]
b=a
c=copy.copy(a)
d=copy.deepcopy(a)
b.append(10)
c[3].append(11)
d[3].append(12)
#a=b=[1, 2, 3, [4, 5, 11], 6, 10]
#c=[1, 2, 3, [4, 5, 11], 6]
#d=[1, 2, 3, [4, 5, 12], 6]
system('pause')
if __name__=='__main__':
test_copy_func()
system('pause')
以上代码可以直接在下面的python官方可视化网站运行,清晰地解释了各个对象的关系Python Tutor - Visualize Python, Java, JavaScript, C, C++, Ruby code execution