我是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'的副本?
非常感谢
编辑:非常感谢您提供的好的和易于理解的答案!
答案 0 :(得分:13)
Python有“东西”和“事物名称”。当你写
side = [5]
你创建了一个新事物[5]
,并将其命名为side
。当你写下
eva = side
为side
创建一个新名称。作业只是给事物命名!仍然只有一件事[5]
,有两个不同的名字。
如果你想要一件新东西,你需要明确地要求它。通常你会copy.copy(thing)
,虽然在列表的情况下有特殊的语法thing[:]
。
FYI“事物”通常被称为“物体”; “名称”通常称为“引用”。
答案 1 :(得分:11)
eva
和side
引用相同的列表。
如果您想拥有该列表的副本:
eva = side[:]
您可以在本文中阅读有关复制列表的更多信息:Python: copying a list the right way
修改:这不是复制列表的唯一方法。请参阅本答复第一条评论中发布的链接。
答案 2 :(得分:1)
dusan's回答是正确的,并且是一种聪明的方法,但我认为它打破了Python的禅宗指南“明确比隐含更好。”
我见过的一个更常见的模式是确保项目是深度复制是使用copy
模块。
>>> import copy
>>> eva = copy.copy(side)