61

我有一个列表,我创建了一个副本,以便在保留原始列表的同时进行一些操作。但是,当我设置copy_listequal to时org_list,它们变成了相同的东西,如果我改变copy_list,它们org_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 数据框。

4

4 回答 4

84

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

copy_list = org_list[:] 
于 2013-11-13T10:56:15.387 回答
20

当你写

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)
于 2013-11-13T11:18:57.167 回答
19

这只是复制参考

copy_list = org_list

你应该使用

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

或者

copy_list = list(org_list)
于 2013-11-13T10:55:02.120 回答
11

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

import copy

copy_list = copy.copy(org_list)
于 2013-11-13T10:56:51.690 回答