【问题标题】:Unexpected list behavior in PythonPython中的意外列表行为
【发布时间】:2014-02-27 12:18:26
【问题描述】:

我想颠倒一个列表,我设法做到了,但在工作的过程中我发现了一些奇怪的东西。以下程序按预期工作,但取消了 list_reversed[i]=list[len(list)-1-i] 和 print(list[i]) 行(注释最后一行当然)会导致 list 发生变化。我没看到什么?我的 Python 版本是 3.3.3。提前谢谢你。

list=[1,2,3,4,5,6]

list_reversed=list

for i in range(0,len(list)):

    #list_reversed[i]=list[len(list)-1-i]
    #print(list[i])

    print(list[len(list)-1-i])

【问题讨论】:

标签: python list behavior


【解决方案1】:

当你这样做时:

list_reversed = list

您不会创建list 的副本,而是创建一个新名称(变量)来引用您之前拥有的相同列表。您可以通过添加以下内容来查看:

print(id(list_reversed), id(list))  # Notice, the same value!!

【讨论】:

    【解决方案2】:

    以下内容:

    list_reversed = list 
    

    使两个变量引用同一个列表。当你改变一个时,它们都会改变。

    要制作副本,请使用

    list_reversed = list[:]
    

    更好的是,使用内置函数而不是自己编写:

    list_reversed = reversed(list)
    

    附:我建议不要使用list 作为变量名,因为它会影响the builtin。

    【讨论】:

    • 啊,我不知道会发生这种情况,现在一切都说得通了,感谢您提供复制列表的解决方案。我在学习如何反转列表时发现了内置函数,但这更像是一个练习,感谢您指出这一点。关于不使用列表作为变量名的好建议,我有一段时间没有编写 Python 程序了,但现在我记得读过。
    【解决方案3】:

    list_reversed = list 不复制列表。它只是使list_reversed 成为指向同一个列表的新名称。您可以在此站点上看到任何数量的其他问题,其中一些在右侧的相关问题中列出。

    【讨论】:

      【解决方案4】:

      list 和 reversed_list 是同一个列表。因此,改变一个也会改变另一个。

      你应该这样做:

      reversed_list = list[::-1]
      

      这会一举反转并复制列表。

      【讨论】:

        【解决方案5】:

        这是关于 python 中列表的一般行为。正在做:

        list_reversed = list
        

        不复制列表,而是对它的引用。你可以运行:

        print(id(list_reversed))
        print(id(list))
        

        两者的输出相同,这意味着它们是同一个对象。您可以通过以下方式复制列表:

        a = [1,2]
        b = a.copy()
        

        或

        a = [1,2]
        b = a[:]
        

        【讨论】:

        • list 实例没有copy 方法(但dict 实例有)
        • 嗯,这不是打败所有的。 (我一直在游说这种改变有一段时间了)。我用 python3.2 进行了测试,它不起作用。然而,python3.4 是另一回事。我手边没有python3.3,所以无法测试。
        • 我在 Arch Linux 上有 3.3.3。无论如何,感谢您的提示。这可能会给我带来一些麻烦。
        猜你喜欢
        • 2010-09-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-11-03
        • 1970-01-01
        • 1970-01-01
        • 2015-02-02
        • 1970-01-01
        相关资源
        最近更新 更多