代码
a = {'a':1}
b = []
for i in range(1,10):
b.append(a)
a['a']=i
print(a)
print(b)
运行结果
{'a': 1}
{'a': 2}
{'a': 3}
{'a': 4}
{'a': 5}
{'a': 6}
{'a': 7}
{'a': 8}
{'a': 9}
[{'a': 9}, {'a': 9}, {'a': 9}, {'a': 9}, {'a': 9}, {'a': 9}, {'a': 9}, {'a': 9}, {'a': 9}]
python中,字典是可变类型数据,而列表里所添加的a字典数据,其实是一种引用,引用该字典数据的内存地址。而当对字典数据进行修改操作时,因为列表中数据都是来自同一个内存地址,所以,列表中每个元素都是同一个内存地址,也就是内容都是相同的。
那如何添加字典数据到列表,避免这种情况呢?
在python中,每次创建可变类型数据时,即使内容一样,内存地址也不相同,内存地址都是不相同
dir = {"a":1}
print(id(dir))
dir = {"a":1}
print(id(dir))
运行:
1800131259192
1800131752168
这里可以发现,内存地址都是不相同的,所以每次创建字典对象,都会分配一个新的内存地址,所以,代码应该修改为:
b = []
for i in range(1,10):
a = {'a':1}
b.append(a)
a['a']=i
print(a)
print(b)
运行:
{'a': 1}
{'a': 2}
{'a': 3}
{'a': 4}
{'a': 5}
{'a': 6}
{'a': 7}
{'a': 8}
{'a': 9}
[{'a': 1}, {'a': 2}, {'a': 3}, {'a': 4}, {'a': 5}, {'a': 6}, {'a': 7}, {'a': 8}, {'a': 9}]
我们会发现,把a = {‘a’:1}放在for循环里面后,列表中的数据不再重复,说明不是同一个内存地址了,因为每次运行到a = {‘a’:1}都会重新分配一个与之前不一样的内存地址