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 都是可变对象,是一种容器,对象被创建后内容可修改。 在没有拷贝的前提下直接重复引用同一可变对像,结果多次引用都是指向的同一对象。 一旦对`容器`进行了某些修改,就自然会造成所有引用的改变。 (话说,还有一个浅拷贝和深拷贝的坑~) |