python:对我的复制变量的更改会影响原始变量

时间:2013-11-13 10:52:38

标签: python

我有一个列表,我创建了一个副本,以便在保留原始列表的同时进行一些操作。但是,当我将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数据帧。

4 个答案:

答案 0 :(得分:49)

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

copy_list = org_list[:] 

答案 1 :(得分:14)

这只是复制参考

copy_list = org_list

你应该使用

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

copy_list = list(org_list)

答案 2 :(得分:12)

写作时

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

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

然后当你做

copy_list = org_list

你的意思是,“名称copy_list引用与org_list相同的对象”。

如果您的列表仅包含不可变类型,则可以通过

创建副本
copy_list = list(org_list)

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

如果您有一个列表列表并希望复制一切,则需要执行DEEP副本:

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

答案 3 :(得分:8)

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

import copy

copy_list = copy.copy(org_list)