python:对my copy变量的更改会影响原始变量

python: changes to my copy variable affect the original variable

本问题已经有最佳答案,请猛点这里访问。

我有一个列表,我创建了一个副本,以便在保留原始列表的同时进行一些操作。但是,当我把copy_list设为org_list时,它们就变成了一样的东西,如果我把copy_list改了,org_list也变了。例如:

1
2
3
4
5
6
7
8
org_list = ['y', 'c', 'gdp', 'cap']

copy_list = org_list

copy_list.append('hum')

print(copy_list)
print(org_list)

收益率

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

我对实际发生的事情不太了解,但看起来org_list实际上是在向copy_list传递信息,所以它们实际上是相同的。

有没有一种方法可以在不做诸如以下笨拙的事情的情况下制作一份组织列表的独立副本:

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

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


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

1
copy_list = org_list[:]


这只是复制参考资料

1
copy_list = org_list

你应该使用

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

1
copy_list = list(org_list)


当你写作时

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

创建列表对象,并将其命名为"org-list"。

当你这样做的时候

1
copy_list = org_list

你的意思是,"复制列表"这个名字和组织列表指的是同一个对象。

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

1
copy_list = list(org_list)

但请注意,只有当列表对象不可变时,这才有效,因为它创建了一个浅副本,即复制了列表,但列表中的每个元素都不重复。

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

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

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

1
2
3
import copy

copy_list = copy.copy(org_list)