Python-从字典中分配和更改列表

Python-从字典中分配和更改列表,python,list,dictionary,python-2.7,Python,List,Dictionary,Python 2.7,在帮助一位同事编写Python 2.7脚本时,我注意到了一些奇怪的事情。他有一本以列表作为字典值的字典。他将字典值分配给一个新变量,然后对列表进行一些编辑。让我感到奇怪的是,新变量中的列表更改也反映在字典中。我在shell中重复了一个简单的示例,并将其发布在下面。我也尝试了同样的方法,但使用了一个字符串作为字典值,但没有效果。这里有我遗漏的东西吗,或者这是某种bug?谢谢 >>> dict1 = {} >>> dict1['foo'] = [1,2,3] &g

在帮助一位同事编写Python 2.7脚本时,我注意到了一些奇怪的事情。他有一本以列表作为字典值的字典。他将字典值分配给一个新变量,然后对列表进行一些编辑。让我感到奇怪的是,新变量中的列表更改也反映在字典中。我在shell中重复了一个简单的示例,并将其发布在下面。我也尝试了同样的方法,但使用了一个字符串作为字典值,但没有效果。这里有我遗漏的东西吗,或者这是某种bug?谢谢

>>> 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[:]

谢谢我刚刚在谷歌上找到了一个页面,解释了这是如何“隐藏”的,现在我有了一些好的关键词。我想这只是一个我以前从未学过的微妙之处。