Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python:与list.remove混淆_Python_List - Fatal编程技术网

Python:与list.remove混淆

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

我对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
[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对象(如字符串)不会以这种方式运行。。。