|
发表于 2020-5-21 14:09:12
|
显示全部楼层
第一个,字典的问题:
dict1= {1:['a','b'],2:['c','d']}
dict2=dict1.copy()
在这里如果我
dict1[1][0] = 'nihao'
那么
dict1和dict2都会变成 {1:['nihao','b'],2:['c','d']}
- >>> d1 = {1:['a', 'b'], 2:['c', 'd']}
- >>> d2 = d1.copy()
- >>> id(d1[1])
- 2650545373248
- >>> id(d2[1])
- 2650545373248
- >>> id(d1[1][0])
- 2650536230512
- >>> id(d2[1][0])
- 2650536230512
- >>> d1[1][0] = 'nihao'
- >>> print(d1)
- {1: ['nihao', 'b'], 2: ['c', 'd']}
- >>> print(d2)
- {1: ['nihao', 'b'], 2: ['c', 'd']}
- >>> id(d1[1][0])
- 2650545611824
- >>> id(d2[1][0])
- 2650545611824
复制代码
list和dict都是可变数据类型,而且位置可索引,所以修改值不会引起地址指向的改变。
但是如果我
dict1[1] = {'nihao','b'}
那么只有 dict1 key 1的值会变 dict2的值不会变
- >>> d1[1] = {'nihao', 'b'}
- >>> id(d1[1])
- 2650545262368
- >>> id(d2[1])
- 2650545373248
- >>> id(d1)
- 2650545030848
- >>> id(d2)
- 2650545139328
- >>>
复制代码
后来,你将dict1 key 1 的值修改为一个集合类型的数据,由于数据类型的改变,内存就必须要开辟一块新的储存空间来存放新的集合数据。
可以发现,两个字典指向的地址已经不一样了。赋值给新类型数据的前后,dict1 key 1 的位置也不一样了。而dict1 key 1的地址却没有改变。
既然这时候两个字典已经被分配了不同的地址,再去做其他操作的时候,就不会相互影响了。所以也就有下面的:
而且如果我dict1.popitem() dict2的也不会变 那么为什么只有当 dict1[1][0]这种情况下 dict2的value也会跟着改变呢?
新手上路:如有不妥,请指正,轻喷!
|
|