【问题标题】:copy of a list in python doesn't keep up with changespython中列表的副本跟不上变化
【发布时间】:2012-10-23 03:05:38
【问题描述】:

我有一个在程序运行时添加项目的列表,并且我创建了该列表的副本,因此我可以更改/修改/检查副本而无需更改原件。

这是我目前得到的:

import copy
originallist.append(stuff)

combined=''.join(originallist)

copyoriginal=copy.deepcopy(originallist) 
##this didnt work as copyoriginal stayed empty [] while originallist would change.
#i also tried 
copyoriginal=list(originallist) 
#AND 
copyoriginal=originallist[:] 
#and with both cases copyoriginal remained at [] while originallist would change!!

为什么不改变?

【问题讨论】:

  • 我认为你在正确的轨道上,但一定有其他事情发生。 "copyoriginal stayed empty []" 到底是什么意思,如果 originallist 是从里面的东西开始的?一个更具体的例子会很有帮助,有实际输出和你的预期输出。
  • 嗨,感谢您的快速回复!我的意思是当我调试程序时它告诉我copyoriginal是[](通过将鼠标悬停在它上面,而originallist中有值[2,6]

标签: python python-3.x


【解决方案1】:

列表的副本不会跟随对原始列表所做的更改;一旦复制完成,python 的列表就会完全分开。

如果没有自定义类,您尝试做的事情是不可能的。

【讨论】:

  • ohhh 那么有没有另一种方法可以让 python 跟上原始列表的更改并将它们复制到副本列表中?或者唯一的方法是在我每次向它添加值时继续复制原始列表..?提前致谢
  • @3MIN3M:没错。完成更改后复制原始列表,或同时更改两个列表。
【解决方案2】:

如果您想“跟上变化”到另一个列表,您可能需要考虑使用简单的引用而不是副本:

a = [1, 2, 3]
b = a # b refers to a

a[0] = 3
print b # prints [3, 2, 3]

当您决定停止跟踪更改时,您可以随时制作副本:

b = b[:]

【讨论】:

    【解决方案3】:

    如果你想命名同一个对象,你可以这样做:

    a = b = []
    a.append(1)
    b.append(2)
    print(b)
    # returns [1,2]
    

    这不会让您更改其中一个而不影响另一个,但它会让您看到其中任何一个的更改。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-20
      • 2022-01-25
      • 1970-01-01
      • 2011-07-05
      相关资源
      最近更新 更多