d = {'country':'China', 'age': '18', 'name': 'Kang'} a = d print(a, d) d['age'] = 100 print(a, d) d['like'] = 'pingpong' print(a, d)
输出:
{'country': 'China', 'age': '18', 'name': 'Kang'} {'country': 'China', 'age': '18', 'name': 'Kang'} {'country': 'China', 'age': 100, 'name': 'Kang'} {'country': 'China', 'age': 100, 'name': 'Kang'} {'country': 'China', 'age': 100, 'name': 'Kang', 'like': 'pingpong'} {'country': 'China', 'age': 100, 'name': 'Kang', 'like': 'pingpong'}
直接赋值的时候 a与d完全相同,类似C中的引用概念,是一个对象的两个别名,因此无论是改变d中原有元素还是给d添加新的元素,a都是随之改变。
直接赋值是两个对象完全共享,浅拷贝则是共享拷贝时候已有的元素,对于添加的新元素则不共享。
import copy d = {'country':'China', 'age': '18', 'name': 'Kang'} a = copy.copy(d) print(a, d) d['age'] = 100 print(a, d) d['like'] = 'pingpong' print(a, d)
输出:
{'country': 'China', 'age': '18', 'name': 'Kang'} {'country': 'China', 'age': '18', 'name': 'Kang'} {'country': 'China', 'age': '18', 'name': 'Kang'} {'country': 'China', 'age': 100, 'name': 'Kang'} {'country': 'China', 'age': '18', 'name': 'Kang'} {'country': 'China', 'age': 100, 'name': 'Kang', 'like': 'pingpong'}
嗯,第三行是对的,对于新添加的元素不会共享。但本来以为改变原字典d的age的值,a会跟着改变的,毕竟age是共享时已有的元素嘛,但这里发现好像打脸了,第二行输出d的age改变而a没有改变,这是因为字典的值更改了以后就相当于一个新的元素了。以下小实验可验证:
d = {'age': 18} print(id(d['age'])) d['age'] = 10000 print(id(d['age']))
输出为:
93899669444160 139985819449552
可以认为id()函数输出对象的地址,可以看到这里地址已经改变了,所以d的age键值对改变前后是两个元素。
即,浅拷贝时子元素共享是对的,但是要注意改变子元素时有没有改变其地址,把原本共享的子元素对象直接改成另一个对象,那肯定不再共享了。
a = copy.deepcopy(d)
这种情况下a和d完全不相关,不存在任何共享。