【问题标题】:Python - Assigning and Changing a List from a DictionaryPython - 分配和更改字典中的列表
【发布时间】:2013-01-09 16:22:20
【问题描述】:

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

【问题讨论】:

    标签: python list dictionary python-2.7


    【解决方案1】:

    您不会获得列表的副本,而是获得对列表本身的引用。由于列表是可变的,因此行为完全符合预期。

    将此与使用指向列表的第二个变量进行比较:

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

    【讨论】:

    • 谢谢!我刚刚在谷歌上找到了一个页面,解释了它是如何“在幕后”工作的,因为我有一些很好的关键字可以使用。我想这只是我以前从未意识到的微妙之处。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多