Python中的意外列表行为 我想翻转一个清单,我设法做到了,但在工作的中间,我发现了一些奇怪的东西。以下程序按预期工作,但取消行list\u reversed[i]=list[len(list)-1-i]和print(list[i])(当然是注释最后一行)会导致列表发生变化。我没有看到什么?我的Python版本是3.3.3。先谢谢你 list=[1,2,3,4,5,6] list_reversed=list for i in range(0,len(list)): #list_reversed[i]=list[len(list)-1-i] #print(list[i]) print(list[len(list)-1-i])
当您这样做时:Python中的意外列表行为 我想翻转一个清单,我设法做到了,但在工作的中间,我发现了一些奇怪的东西。以下程序按预期工作,但取消行list\u reversed[i]=list[len(list)-1-i]和print(list[i])(当然是注释最后一行)会导致列表发生变化。我没有看到什么?我的Python版本是3.3.3。先谢谢你 list=[1,2,3,4,5,6] list_reversed=list for i in range(0,len(list)): #list_reversed[i]=list[len(list)-1-i] #print(list[i]) print(list[len(list)-1-i]),python,list,behavior,Python,List,Behavior,当您这样做时: list_reversed = list 您不会创建列表的副本,而是创建一个新名称(变量),该名称引用了您以前拥有的相同列表。您可以通过添加以下内容看到这一点: print(id(list_reversed), id(list)) # Notice, the same value!! 以下是: list_reversed = list 使两个变量引用相同的列表。当你改变一个,他们都改变 要复制,请使用 list_reversed = list[:] 更好的方法是使用内
list_reversed = list
您不会创建列表的副本,而是创建一个新名称(变量),该名称引用了您以前拥有的相同列表。您可以通过添加以下内容看到这一点:
print(id(list_reversed), id(list)) # Notice, the same value!!
以下是:
list_reversed = list
使两个变量引用相同的列表。当你改变一个,他们都改变
要复制,请使用
list_reversed = list[:]
更好的方法是使用内置函数,而不是编写自己的函数:
list_reversed = reversed(list)
另外,我建议不要使用list
作为变量名,因为它会产生阴影。list\u reversed=list
不会复制列表。它只会使list\u反转
一个指向同一列表的新名称。你可以在这个网站上看到很多关于这个问题的其他问题,一些问题列在右边的相关问题中。list
和reversed\u list
是同一个列表。因此,改变一个也会改变另一个
你应该做的是:
reversed_list = list[::-1]
这将一次性反转和复制列表。这是关于python中列表的一般行为。做:
list_reversed = list
不复制列表,而是复制对它的引用。您可以运行:
print(id(list_reversed))
print(id(list))
两者的输出相同,这意味着它们是相同的对象。您可以通过以下方式复制列表:
a = [1,2]
b = a.copy()
或
检查list
实例没有copy
方法(但是dict
实例有)好吧,这不是比一切都好吗。(我为这一变化游说了一段时间)。我用python3.2进行了测试,但它不起作用。然而,python3.4则是另一回事。我手边没有python3.3,所以我无法测试它。我在ArchLinux上有3.3.3。无论如何,谢谢你的提示。这可能会给我带来一些麻烦。啊,我不知道发生了什么,现在一切都有意义了,谢谢你提供了复制列表的解决方案。我在学习如何反转列表时发现了内置函数,但这更像是一个练习,感谢您指出这一点。关于不使用list作为变量名的好建议,我已经有一段时间没有编写Python了,但现在我记得读过这方面的内容。
a = [1,2]
b = a[:]