重写赋值以保持更改Python类中的原始实例变量

重写赋值以保持更改Python类中的原始实例变量,python,Python,基本上,这就是问题所在。我有一个带有可选参数的类:lst。lst是一个嵌套列表。下面是一个方法,它返回它所在的类的另一个实例 self.lst = [[[1, 2]]] # this is defined in the constructor s = self.lst for a in s: for b in a: if b[0] != item: b[0] = 5 return ChangeNumb(lst=s) 这之后发生的事情很奇怪。返回

基本上,这就是问题所在。我有一个带有可选参数的类:lst。lst是一个嵌套列表。下面是一个方法,它返回它所在的类的另一个实例

self.lst = [[[1, 2]]] # this is defined in the constructor
s = self.lst
for a in s:
    for b in a:
        if b[0] != item:
             b[0] = 5
return ChangeNumb(lst=s)
这之后发生的事情很奇怪。返回的changenamb.lst现在为[[[5,2]],但运行该方法的类也为changenamb.lst==[[5,2]]

因此,该方法不只是返回具有不同参数的类的新实例,而是同时更改其所在类的self.lst

我需要使self.lst在返回新实例时不会更改

请帮忙


编辑:虽然我在编写类构造函数时遇到了类似的问题,但我能够通过->self.lst=lst.copy()解决它;但是,s=self.lst.copy()不起作用

为了不修改self.lst,您必须复制一份。
对于简单的列表,只需
list()
就足够了,但由于您有嵌套列表,所以应该使用

因此,您可以通过以下方式更改您的声明:

s = copy.deepcopy(self.lst)

list.copy
方法不存在。要复制列表,只需将其切片:
lst[:]
.list.copy()运行,因为它是列表对象的一个方法;我刚刚尝试了lst[:],但结果是一样的。@mgilson:它是在3.3中引入的。在这种情况下,切片复制将不起作用,它只是复制引用,请使用
copy.deepcopy()
@user2357112--谢谢。我知道它是被提议的,(我认为添加它是一个好的决定)。我很高兴你提到这篇文章,为其他看到这篇文章的人提供文档。我认为你需要在循环中变异之前复制这个列表。请尝试
s=copy.deepcopy(self.lst)
,然后保持原样。您能给我解释一下如何使用deepcopy吗?因为我尝试了a=[[1]]b=a.deepcopy(),但它只返回AttributeError:“list”对象没有属性“deepcopy”@Charlie:
import copy
then
b=copy.deepcopy(a)