def run(data):
s = []
for c in ['ccc', 'ddd']:
data['c'] = c
print(data)
s.append(data)
print(s)
if __name__ == "__main__":
run({'a': 'aaa', 'b': 'bbb'})
{'a': 'aaa', 'b': 'bbb', 'c': 'ccc'}
{'a': 'aaa', 'b': 'bbb', 'c': 'ddd'}
[{'a': 'aaa', 'b': 'bbb', 'c': 'ccc'}, {'a': 'aaa', 'b': 'bbb', 'c': 'ddd'}]
{'a': 'aaa', 'b': 'bbb', 'c': 'ccc'}
{'a': 'aaa', 'b': 'bbb', 'c': 'ddd'}
[{'a': 'aaa', 'b': 'bbb', 'c': 'ddd'}, {'a': 'aaa', 'b': 'bbb', 'c': 'ddd'}]
1
jxxz 2019-12-24 23:49:57 +08:00 via iPhone
引用传递
|
2
jxxz 2019-12-24 23:51:26 +08:00 via iPhone
append 的是两个相同的 data 字典对象,所以第二次 ddd 覆盖了第一次的 ccc
|
3
jugelizi 2019-12-24 23:51:53 +08:00
哈哈 这分词 bug
你应该看下变量在内存里如何存放的 |
4
melovto 2019-12-24 23:52:37 +08:00
函数传的是引用 改变了外部变量
|
5
wangyzj 2019-12-24 23:53:52 +08:00
list 不是副本
|
7
CzaOrz 2019-12-25 09:58:26 +08:00
我也遇到过类似问题。并不是覆盖与被覆盖的关系,也不是引用了外部变量。
造成这种现象是因为 list 和 dict 都是可变对象,是一种容器,对象被创建后内容可修改。 在没有拷贝的前提下直接重复引用同一可变对像,结果多次引用都是指向的同一对象。 一旦对`容器`进行了某些修改,就自然会造成所有引用的改变。 (话说,还有一个浅拷贝和深拷贝的坑~) |