Python 列表更改,即使它没有被更改
就函数而言,它将列表作为一个参数,将其复制到另一个returnarray变量,该变量将被篡改,直到最后返回为止。请注意,它的工作原理是我得到正确的结果,但不知何故,该函数改变了原始变量。我是不是遗漏了什么?显然,第二个示例中的somelist或savedarray应该返回未更改的数组Python 列表更改,即使它没有被更改,python,Python,就函数而言,它将列表作为一个参数,将其复制到另一个returnarray变量,该变量将被篡改,直到最后返回为止。请注意,它的工作原理是我得到正确的结果,但不知何故,该函数改变了原始变量。我是不是遗漏了什么?显然,第二个示例中的somelist或savedarray应该返回未更改的数组 Class A: def somefunction(self,somelist): savedarray = somelist print(str(somelist)) #
Class A:
def somefunction(self,somelist):
savedarray = somelist
print(str(somelist)) #Prints ["1","#2","3","#4"]
b = B()
filterlist = b.remove_tagfromarray(somelist)
print(str(savedarray)) #Prints ["1","3"] WHY!?!?!?!?
print(str(filterlist)) #Prints ["1","3"]
简单地说,列表可以通过引用传递。在所列代码之外的代码中,这些列表通过一个引用另一个或类似性质的东西链接在一起
def remove_tagfromarray(self,somelist,bannedchar="#"):
popque = []
popcount = 0
n=0
returnarray=somelist
for word in returnarray:
if (bannedchar in word)):
popque.append(n)
n+=1
for target in popque:
returnarray.pop(target-popcount)
popcount = popcount + 1
return returnarray
Python通过引用传递所有内容。此行使returnarray和somelist这两个名称引用同一个列表。您对returnarray所做的一切都将反映在somelist中
制作一份副本:
returnarray=somelist
如果您实际向我们展示remove_tagfromarray的代码,可能会有所帮助。也就是说,Python喜欢通过引用传递对象,因此savedarray=somelist只会创建对同一列表的新引用。对不起,我添加了从列表中删除标记的代码。是的,我知道可能有更好的方法来实现这一点。很可能是通过引用传递对象。如果是,我能做些什么?我将尝试读取另一个线程并执行创建复制列表的拼接方法。是的,在FilterWord中或在调用它之前创建列表的副本应该可以做到这一点。slice操作符的作用是:returnarray=somelist[:]阅读链接的问题及其答案。它描述了完全相同的问题。初学者经常会提出问题,因此可以很快被识别和解决。
returnarray=somelist
returnarray=somelist[:]