我在帮助一位同事编写 Python 2.7 脚本时注意到一些奇怪的事情。他有一本字典,其中包含列表作为字典值。他将字典值分配给一个新变量,然后对列表进行一些编辑。让我感到奇怪的是新变量中的列表更改也反射(reflect)在字典中。我在 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]。
最佳答案
您不会获得列表的副本,您会获得对列表本身的引用。由于列表是可变的,因此这种行为完全是预料之中的。
将此与使用指向列表的第二个变量进行比较:
>>> 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[:]
关于Python - 从字典中分配和更改列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14241636/