在Python2中尝试复制列表并修改其一个版本

在Python2中尝试复制列表并修改其一个版本,python,list,variables,indexing,python-2.x,Python,List,Variables,Indexing,Python 2.x,我想复制一个列表并修改副本,但当我尝试此操作时,我最终也修改了原始列表 我的问题的高度简化版本: list = [2,3,6,8,9,6,7,4,56,8,9,6,7,8] new_list = list new_list[2] = 'n' print list print new_list 我只想更改新列表的第2项,但当我尝试此操作时,新列表和旧列表都将更改为: [2,3,'n',8,9,6,7,4,56,8,9,6,7,8] 这里有没有我遗漏的一些基本的东西 如果我将列表中的每个项

我想复制一个列表并修改副本,但当我尝试此操作时,我最终也修改了原始列表

我的问题的高度简化版本:

list = [2,3,6,8,9,6,7,4,56,8,9,6,7,8]

new_list = list

new_list[2] = 'n'

print list
print new_list
我只想更改新列表的第2项,但当我尝试此操作时,新列表和旧列表都将更改为:

[2,3,'n',8,9,6,7,4,56,8,9,6,7,8]
这里有没有我遗漏的一些基本的东西

如果我将列表中的每个项目逐个添加到下一个列表中,我可以让它执行我想要的操作:

list = [2,3,6,8,9,6,7,4,56,8,9,6,7,8]

new_list = []

for item in list:
    new_list.append(item)

new_list[2] = 'n'

print list
print new_list

如果我这样做,只有
new\u list
会改变,但有没有更直接的方法?

使用
new\u list=a\u list[:]
制作一个
a\u list
的浅显副本:

a_list = [2,3,6,8,9,6,7,4,56,8,9,6,7,8]    
new_list = a_list[:]    
new_list[2] = 'n'    
print a_list
print new_list
屈服

[2, 3, [6, 8], 9, 6, 7, 4, 56, 8, 9, 6, 7, 8]
[2, 3, [6, 'n'], 9, 6, 7, 4, 56, 8, 9, 6, 7, 8]
将变量名视为指向对象的引用。 当你说
new\u list=a\u list
时,你是在告诉Python让
new\u list
指向
a\u list
指向的同一个对象。这就是为什么修改
新列表
时也会修改
新列表


请抵制列出清单的诱惑
list
。这将覆盖
列表
函数的内置定义

PPS<代码>新建列表=列表[:]创建浅层副本。如果

a_list = [1, 2,[3,6]]
new_list = a_list[:]
然后

将同时修改
a_列表
new_列表
中的子列表。如果你想做深度复制,那么使用

import copy
new_list = copy.deepcopy(a_list)

相反。

要制作列表的新副本,请尝试:

newList = list(oldList)
或通过切片更隐晦简洁:

newlist = oldList[:]
仅将
oldList
分配给
newList
将导致两个名称指向同一对象,如下所示:

通用对象复制功能由提供。(图片取自:)。

当你在做

new_list = list
您的
新列表
实际上不是新列表,而是对旧列表的新引用

您可以使用切片表示法创建副本:

>>> l = [1, 2]
>>> l2 = l[:]
>>> l2[0]=42
>>> l
[1, 2]
>>> l2
[42, 2]

另外,不要使用
list
作为变量名,它与内置的
list
类型冲突。

是的,您缺少一些基本的内容。Python永远不会复制对象,除非您明确要求它,如
myList[:]
中所述

无论何时使用
=
,就像在
mylist=[2,3,4]
中一样,都会将左侧的名称指定给右侧的值。在本例中,您有一个值,
[2,3,4]
(一个文本),并为该特定列表指定一个新名称,
“mylist”


编写
new\u list=mylist
时也会发生同样的情况:右侧是一个值,但这次是由其名称给出的。Python查找此名称并查找现有列表。然后这个列表得到了一个新名称,
“newlist”
,但您仍然只有一个列表(有两个名称)。

可能是重复的,我认为克隆是答案,虽然不是我真正的问题好的,是的,在我的实际脚本中,变量被称为“AGP”,感谢关于子列表的提示,我正要被它抓住“抵制所有列表的诱惑。”?@PeterMortensen:谢谢,更正了。这是一种误导。你需要认识到,当你分配数字或令人困惑的字符串或元组时,改变一个不会改变另一个。
>>> l = [1, 2]
>>> l2 = l[:]
>>> l2[0]=42
>>> l
[1, 2]
>>> l2
[42, 2]