Python中的copy、deepcopy

deepcopy没有什么说的,使用这个方法,会在内存中开辟一块新内存出来,赋值的两个变量等值,但是内存地址完全不同,所以相互不会影响,要说的是浅copy,还是先看例子:
a = [0, 1, 2, 3, [4, 5, 6], 7]
b = a[:]
a[0] = 5
a[4][0] = 99
print(a)
print(b)
结果是:
[5, 1, 2, 3, [99, 5, 6], 7]
[0, 1, 2, 3, [99, 5, 6], 7]
看起来是不是有些怪异?a[0] = 5只对a产生影响,a[4][0] = 99却对a和b都产生了影响。 一步一步看,分析这个过程中的内存变化,首先是
a = [0, 1, 2, 3, [4, 5, 6], 7]
此时在内存中开辟了一块内存空间,放置的是[0, 1, 2, 3, [4, 5, 6], 7],然后将它赋值给a 1 然后是
b = a[:]
此时,b复制了a,
a = [0, 1, 2, 3, [4, 5, 6], 7]
b = a[:]
print(id(a))
print(id(b))
结果是:
42696792
42698152
可以看到是不同的地址,所以内存中是这样: 2 但是,由于是浅复制,所以,Python只会复制父对象,子对象Python不会复制,我们可以验证一下:
a = [0, 1, 2, 3, [4, 5, 6], 7]
b = a[:]
print([id(x) for x in a])
print([id(x) for x in b])
结果:
[31619700, 31619688, 31619676, 31619664, 43311592, 31619616]
[31619700, 31619688, 31619676, 31619664, 43311592, 31619616]
可以看到子对象还是同一个地址,所以,在内存中应该是这个样子: 3 所以,当执行了
a[0] = 5
之后,是这个样子: 4 由于b[0]依然指向原来的那个值,就是0,所以b[0]不变,但是a[4][0]重新赋值之后,b[4][0]也变化了,这个问题刚开始想了半天,现在弄明白了。 由于a[4]和b[4]指向的是同一个内存地址: 5 所以执行
a[4][0] = 99
发生了这样的变化: 6 所以导致b[4][0]也发生了变化。 PS:在查资料的时候发现网上有些错误的文章,所以最好还是看官方文档研究。