Python:与list.remove混淆
我对Python非常陌生,所以很抱歉问了一个可能很简单的问题。 (尽管如此,我现在花了两个小时寻找答案) 我简化了代码以说明问题:Python:与list.remove混淆,python,list,Python,List,我对Python非常陌生,所以很抱歉问了一个可能很简单的问题。 (尽管如此,我现在花了两个小时寻找答案) 我简化了代码以说明问题: side=[5] eva=side print(str(side) + " side before") print(str(eva) + " eva before") eva.remove(5) print(str(side) + " side after") print(str(eva) + " eva after") 这将产生: [5] side before
side=[5]
eva=side
print(str(side) + " side before")
print(str(eva) + " eva before")
eva.remove(5)
print(str(side) + " side after")
print(str(eva) + " eva after")
这将产生:
[5] side before
[5] eva before
[] side after
[] eva after
为什么remove命令也会影响列表“side”?在不修改列表的情况下,如何使用“side”副本
多谢各位
编辑:非常感谢你的好的和可理解的答案
eva
和侧
参考相同的列表
如果您想要列表的副本:
eva = side[:]
您可以在本文中阅读有关复制列表的更多信息:
编辑:这不是复制列表的唯一方法。请参阅此答案第一条评论中的链接。答案是正确的,是一种聪明的方法,但我认为它打破了Python禅宗的“显式优于隐式”准则
我见过的一种更常见的模式是使用copy
模块来确保项目是deepcopy
>>> import copy
>>> eva = copy.copy(side)
Python有“事物”和“事物名称”。当你写作时
side = [5]
您创建了一个新事物[5]
,并将其命名为侧
。当你写的时候
eva = side
您为侧
创建了一个新名称。作业只是给事物命名!仍然只有一件事[5]
,有两个不同的名字
如果你想要一件新东西,你需要明确地要求它。通常你会做copy.copy(thing)
,尽管在列表中有特殊的语法thing[:]
仅供参考,“事物”通常称为“对象”;“名称”通常被称为“引用”。您在python中遇到了名称的概念@学习名称空间是完全不同的事情。他遇到了一个事实,Python中没有值类型(是的,这也可以用无数其他方式来描述——但“名称空间”不在其中)。@delnan同意;我惊恐地意识到我写了名称空间并编辑成了名称。杜桑在(当前)最热门答案中的链接无论如何都比我的好。还有一个很好的答案。或者,从文章eva=list(侧面)来看,我认为它没有违反明确性准则。它是显式复制!可能是不透明语法。还请注意,
copy.copy
与[:]
相同,而不是copy.deepcopy
。这两个用例是不同的。您不一定总是想复制列表中的项目。侧[:]
是惯用的Python。要备份我之前的评论,我将在Python 2.7源库目录中创建所有Python文件。在1540个文件中,copy.copy
或copy.deepcopy
被使用了132次<代码>[:]出现441次,但用于复制176次。所以[:]
与使用copy.copy
一样惯用。正确的答案是列表是可变的!其他Python对象(如字符串)不会以这种方式运行。。。