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

nat*_*002 42 python

我有一个列表,我创建了一个副本,以便在保持原始列表的同时进行一些操作.但是,当我设置copy_list相同时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)
Run Code Online (Sandbox Code Playgroud)

回报

['y', 'c', 'gdp', 'cap', 'hum']
['y', 'c', 'gdp', 'cap', 'hum']
Run Code Online (Sandbox Code Playgroud)

我不太了解实际发生的事情,但它看起来org_list实际上已经过去了,copy_list所以它们实际上是同一个东西.

有没有办法制作org_list的独立副本而不做一些笨拙的事情:

copy_list = []
for i in org_list:
    copy_list.append(i)
Run Code Online (Sandbox Code Playgroud)

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

yuv*_*uvi 58

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

copy_list = org_list[:] 
Run Code Online (Sandbox Code Playgroud)

  • @ 43.52.4D.只有它不是一个bug :-) (12认同)
  • 我只花了3个小时试图调试我的程序......我以为我疯了.这是我遇到的最令人愤怒的错误.哇... (8认同)
  • @SachinSingh然后你需要循环复制,因为矩阵实际上是一个引用列表.复制该列表并不意味着复制引用(这是有道理的).虽然这不是一个非常常见的情况(我想不出任何理由为什么你需要这样做才是诚实的) (3认同)
  • 如果有对象列表,则需要执行“深层复制”:`import copy new_list = copy.deepcopy(old_list)` (3认同)
  • @yuvi 如果它是一个二维数组呢? (2认同)

Joh*_*ooy 17

这只是复制引用

copy_list = org_list
Run Code Online (Sandbox Code Playgroud)

你应该使用

copy_list = org_list[:]    # make a slice that is the whole list
Run Code Online (Sandbox Code Playgroud)

要么

copy_list = list(org_list)
Run Code Online (Sandbox Code Playgroud)

  • Python 3.3+提供了一种复制方法:`copy_list = org_list.copy()` (3认同)

Rob*_*rto 15

当你写作

org_list = ['y', 'c', 'gdp', 'cap']
Run Code Online (Sandbox Code Playgroud)

您创建列表对象,并将其命名为"org_list".

然后当你这样做

copy_list = org_list
Run Code Online (Sandbox Code Playgroud)

你只是说,"名称copy_list引用与org_list相同的对象".

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

copy_list = list(org_list)
Run Code Online (Sandbox Code Playgroud)

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

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

import copy
org_list = ['y', 'c', ['gdp', 'rtd'], 'cap']
copy_list = copy.deepcopy(org_list)
Run Code Online (Sandbox Code Playgroud)


And*_*ffe 9

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

import copy

copy_list = copy.copy(org_list)
Run Code Online (Sandbox Code Playgroud)

  • 如果它是一个二维数组呢? (3认同)
  • @SachinSingh你可以使用`firstList = copy.deepcopy(secondList)` (3认同)
  • @亚历克斯非常感谢!!我有一个二维数组,你解决了我的问题 (2认同)