在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]