我在用他的Python 2.7脚本帮助同事时发现了一些奇怪的事情。他有一个字典,列表作为字典值。他将字典值分配给新变量,然后对列表执行一些编辑。得到我的奇怪部分是新变量中的列表更改也在字典中反映出来。我在shell中重复了一个简单的例子,我在下面发布了它。我也试过同样的事情,但用字符串作为字典值,但没有效果。我在这里缺少什么或者这是某种错误吗?感谢。
>>> dict1 = {}
>>> dict1['foo'] = [1,2,3]
>>> print dict1
{'foo': [1, 2, 3]}
>>> bar = dict1['foo']
>>> bar.append(4)
>>> print dict1
{'foo': [1, 2, 3, 4]}
在上面的示例中,我希望将4附加到 bar ,并将'foo'的值保留为[1,2,3]。
答案 0 :(得分:3)
您没有获得列表的副本,您将获得对列表本身的引用。由于列表是可变的,因此完全可以预期行为。
将此与使用指向列表的第二个变量进行比较:
>>> a = [1, 2, 3]
>>> b = a
>>> b.append(4)
>>> a
[1, 2, 3, 4]
如果您想要一个独立的列表,请复制一份:
>>> c = list(a)
>>> c.append(5)
>>> c
[1, 2, 3, 4, 5]
>>> a
[1, 2, 3, 4]
制作副本的另一种方法是使用完整列表切片:
>>> c = a[:]