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

标签 python list dictionary python-2.7

我在帮助一位同事编写 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/

相关文章:

Python 打包文档

python - 如何将 Smartsheet 响应写入文件?

javascript - getByTitle() 不返回 Sharepoint 列表

Python [x::y] 切片运算符 - 为什么对我不起作用?

java - 在 ArrayList 中使用泛型(Java, "cannot be applied"错误)

dictionary - 在 F# 中多次更新 map

Python 将随机 float 舍入到 2D 均匀网格上的最近点

在 10.5.8 上从 Macports 安装的 Python 3.1 - 搁置错误(是否有错误?)

python - 如何将带有索引列表的字典映射到新变量

typescript : map 有关键(对象)不工作