Python:与list.remove混淆

时间:2012-03-08 17:35:42

标签: python list

我是Python的新手,很抱歉这个简单的问题。 (虽然,我现在花了2个小时才找到答案)

我简化了我的代码以说明问题:

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'的副本?

非常感谢

编辑:非常感谢您提供的好的和易于理解的答案!

3 个答案:

答案 0 :(得分:13)

Python有“东西”和“事物名称”。当你写

side = [5]

你创建了一个新事物[5],并将其命名为side。当你写下

eva = side

side创建一个新名称。作业只是给事物命名!仍然只有一件事[5],有两个不同的名字。

如果你想要一件新东西,你需要明确地要求它。通常你会copy.copy(thing),虽然在列表的情况下有特殊的语法thing[:]

FYI“事物”通常被称为“物体”; “名称”通常称为“引用”。

答案 1 :(得分:11)

evaside引用相同的列表。

如果您想拥有该列表的副本:

eva = side[:]

您可以在本文中阅读有关复制列表的更多信息:Python: copying a list the right way

修改:这不是复制列表的唯一方法。请参阅本答复第一条评论中发布的链接。

答案 2 :(得分:1)

dusan's回答是正确的,并且是一种聪明的方法,但我认为它打破了Python的禅宗指南“明确比隐含更好。”

我见过的一个更常见的模式是确保项目是深度复制是使用copy模块。

>>> import copy
>>> eva = copy.copy(side)