Python:对我的副本变量的更改会影响原始变量。

17 浏览
0 Comments

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数据框。

admin 更改状态以发布 2023年5月24日
0
0 Comments

当你写

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

你创建了一个列表对象,将其命名为“org_list”。

然后当你执行

copy_list = org_list

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

如果你的列表只包含不可变类型,那么可以通过

copy_list = list(org_list)

创建一个副本,但请注意,这仅在列表对象是不可变的情况下有效,因为它创建了一个浅复制,即列表被复制,但列表上的每个元素并未复制。

如果你有一个包含列表的列表,想要复制全部内容,你需要执行深层复制:

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

0
0 Comments

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

copy_list = org_list[:] 

0