【问题标题】:python: changes to my copy variable affect the original variable [duplicate]python:对我的复制变量的更改会影响原始变量[重复]
【发布时间】:2013-11-25 22:31:09
【问题描述】:

我有一个列表,我创建了一个副本,以便在保留原始列表的同时进行一些操作。但是,当我将copy_list 设置为等于org_list 时,它们变成了相同的东西,如果我更改copy_listorg_list 也会发生变化。例如:

org_list = ['y', 'c', 'gdp', 'cap']

copy_list = org_list

copy_list.append('hum')

print(copy_list)
print(org_list)

返回

['y', 'c', 'gdp', 'cap', 'hum']
['y', 'c', 'gdp', 'cap', 'hum']

我不太了解实际发生的情况,但看起来 org_list 实际上将自己传递给 copy_list,因此它们实际上是同一件事。

有没有一种方法可以制作 org_list 的独立副本而不会做一些笨拙的事情:

copy_list = []
for i in org_list:
    copy_list.append(i)

我这样说是因为我对其他类型的变量也有同样的问题,例如 pandas 数据框。

【问题讨论】:

  • Python 中的赋值创建新对象 - 赋值仅在 [变量] 名称和对象之间建立绑定。这应该解释一切,而不是谈论“参考”。

标签: python


【解决方案1】:

那是因为在 python 中设置变量实际上设置了对变量的引用。几乎每个学习 Python 的人都会在某个时候遇到这种情况。解决方法就是复制列表:

copy_list = org_list[:] 

【讨论】:

  • 我刚刚花了 3 个小时试图调试我的程序......我以为我快疯了。这是我遇到过的最令人愤怒的错误。哇...
  • @43.52.4D。只是它不是错误:-)
  • @yuvi 如果它是一个二维数组呢?
  • @SachinSingh 那么你需要循环复制,因为矩阵实际上是一个引用列表。复制该列表并不意味着也复制引用(这是有道理的)。虽然这不是一个很常见的情况(我想不出你为什么需要这样做,说实话)
  • 如果您有对象列表,则需要进行“深度复制”:import copy new_list = copy.deepcopy(old_list)
【解决方案2】:

当你写作时

org_list = ['y', 'c', 'gdp', 'cap']

您创建列表对象,并将其命名为“org_list”。

那么当你这样做时

copy_list = org_list

您的意思是,“名称 copy_list 与 org_list 所指的对象相同”。

如果你的列表只包含不可变类型,那么你可以创建一个副本

copy_list = list(org_list)

但请注意,这仅在列表对象不可变时才有效,因为它会创建一个 SHALLOW 副本,即复制列表,但不会复制列表中的每个元素。

如果您有一个列表列表并希望所有内容都被复制,则需要执行深度复制:

import copy
org_list = ['y', 'c', ['gdp', 'rtd'], 'cap']
copy_list = copy.deepcopy(org_list)

【讨论】:

  • 换句话说,如果你不深拷贝你最终会得到:copy_list = ['y','c',org_list[2],'cap']
【解决方案3】:

这只是复制参考

copy_list = org_list

你应该使用

copy_list = org_list[:]    # make a slice that is the whole list

copy_list = list(org_list)

【讨论】:

  • 如果它是一个二维数组会怎样。
  • @SachinSingh,然后您还需要复制每个子列表。您可能应该检查 deepcopy。 docs.python.org/3/library/copy.html
  • 谢谢。我看到了。但是,我的意思是不使用 deepcopy 的情况下,是否还有另一种方法可以做到这一点?
  • Python 3.3+ 提供复制方法:copy_list = org_list.copy()
【解决方案4】:

python 中的变量名是对原始变量的引用。要实际制作副本,您需要成为explicit

import copy

copy_list = copy.copy(org_list)

【讨论】:

  • 如果是二维数组呢?
  • @SachinSingh 你可以使用firstList = copy.deepcopy(secondList)
  • @Alex 非常感谢!!我有一个二维数组,你解决了我的问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-04-16
  • 1970-01-01
  • 2021-05-15
  • 2021-01-08
  • 1970-01-01
  • 2015-12-30
  • 2021-11-03
相关资源
最近更新 更多