Python 列表更改,即使它没有被更改

Python 列表更改,即使它没有被更改,python,Python,就函数而言,它将列表作为一个参数,将其复制到另一个returnarray变量,该变量将被篡改,直到最后返回为止。请注意,它的工作原理是我得到正确的结果,但不知何故,该函数改变了原始变量。我是不是遗漏了什么?显然,第二个示例中的somelist或savedarray应该返回未更改的数组 Class A: def somefunction(self,somelist): savedarray = somelist print(str(somelist)) #

就函数而言,它将列表作为一个参数,将其复制到另一个returnarray变量,该变量将被篡改,直到最后返回为止。请注意,它的工作原理是我得到正确的结果,但不知何故,该函数改变了原始变量。我是不是遗漏了什么?显然,第二个示例中的somelist或savedarray应该返回未更改的数组

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[:]