Python 为什么在类中会发生这种情况

Python 为什么在类中会发生这种情况,python,class,python-2.7,Python,Class,Python 2.7,我写了以下课程,内容如下: class abc: def __init__(self): self.Values = [] def add_code(self): lastval = self.Values print "self.Values , ", self.Values print "lastval , ", lastval lastval.append(1) print

我写了以下课程,内容如下:

class abc:
    def __init__(self):
        self.Values = []
    def add_code(self):
        lastval = self.Values
        print "self.Values  , ", self.Values
        print "lastval  , ", lastval
        lastval.append(1)
        print "self.Values 1, ", self.Values
        print "lastval 1 , ", lastval

        lastval.append(2)
        print "lastval 2 , ", lastval
        print "self.Values 2 , ", self.Values
        lastval.append(3)
        print "lastval 3 , ", lastval
        print "self.Values 3 , ", self.Values
        lastval.append(4)
        print "last val 4 ", lastval
        print "self.Values 4 , ", self.Values
        lastval = []
        print "last value is emtpy now? , ", lastval
        print "But the self.Values is not", self.Values
        return lastval
当我运行这段代码时,我看到变量
lastval
附加了值,
self.values
但是当我用空列表初始化
lastval
时,我仍然看到
self.Values
保留这些值。
原因可能是什么?你为什么不这么想?首先,将
lastval
指定为指向与
self.Values
相同的列表,以便在另一个列表中可以看到一个值的突变。但是,当您执行
lastval=[]
操作时,只需将
lastval
重新绑定到一个新列表,您根本不会影响
自我价值观。

您为什么会这样想?首先,将
lastval
指定为指向与
self.Values
相同的列表,以便在另一个列表中可以看到一个值的突变。但是,当您执行
lastval=[]
操作时,只需将
lastval
重新绑定到一个新列表,就不会影响
self.Values

类与此无关。潜在的影响是多个变量可以保存同一个列表(这是通过赋值实现的)。如果你改变列表,所有的变量都会改变

您可能希望创建列表的副本来避免这种情况。

类与此无关(或没有太多)。潜在的影响是多个变量可以保存同一个列表(这是通过赋值实现的)。如果你改变列表,所有的变量都会改变


您可能希望创建列表的副本以避免这种情况。

在运行
\uuuu init\uuu
方法后,内存中有两个对象:

#1 Instance of abc
#2 Array
它们包括:

#1 Instance of abc
    Values : Reference to #2

#2 Array
    [ ]
现在我们调用add_代码,它将运行:

lastval = self.Values
print "self.Values  , ", self.Values
print "lastval  , ", lastval
此时,lastval和self.value都是对数组对象#2的引用。因此,我们:

#1 Instance of abc
    Values : Reference to #2

#2 Array
    [ ]

Local variables
    self : Reference to #1
    lastval : Reference to #2
继续

lastval.append(1)
print "self.Values 1, ", self.Values
print "lastval 1 , ", lastval
append
方法修改对象2。现在我们有:

#1 Instance of abc
    Values : Reference to #2

#2 Array
    [ 1 ]

Local variables
    self : Reference to #1
    lastval : Reference to #2
#1 Instance of abc
    Values : Reference to #2

#2 Array
    [ 1, 2, 3, 4 ]

Local variables
    self : Reference to #1
    lastval : Reference to #2
这种情况也在继续

lastval.append(2)
print "lastval 2 , ", lastval
print "self.Values 2 , ", self.Values
lastval.append(3)
print "lastval 3 , ", lastval
print "self.Values 3 , ", self.Values
lastval.append(4)
print "last val 4 ", lastval
print "self.Values 4 , ", self.Values
现在我们有:

#1 Instance of abc
    Values : Reference to #2

#2 Array
    [ 1 ]

Local variables
    self : Reference to #1
    lastval : Reference to #2
#1 Instance of abc
    Values : Reference to #2

#2 Array
    [ 1, 2, 3, 4 ]

Local variables
    self : Reference to #1
    lastval : Reference to #2
在这一点上,我们做了一些不同的事情:

lastval = []
这是对局部变量的赋值。它对反对#2没有任何作用。它会创建一个新数组。因此,最后我们有:

#1 Instance of abc
    Values : Reference to #2

#2 Array
    [ 1, 2, 3, 4 ]

#3 Array
    [ ]

Local variables
    self : Reference to #1
    lastval : Reference to #3
如您所见,lastval和self.Value现在引用不同的对象


要理解的重要一点是更新变量以引用不同对象和修改现有对象的区别。有关深入的讨论,请参见(该文档是针对Python 3的,但Python 2和Python 3在这些概念上没有重大区别)。

在运行
\uuuu init\uuu
方法后,内存中有两个对象:

#1 Instance of abc
#2 Array
它们包括:

#1 Instance of abc
    Values : Reference to #2

#2 Array
    [ ]
现在我们调用add_代码,它将运行:

lastval = self.Values
print "self.Values  , ", self.Values
print "lastval  , ", lastval
此时,lastval和self.value都是对数组对象#2的引用。因此,我们:

#1 Instance of abc
    Values : Reference to #2

#2 Array
    [ ]

Local variables
    self : Reference to #1
    lastval : Reference to #2
继续

lastval.append(1)
print "self.Values 1, ", self.Values
print "lastval 1 , ", lastval
append
方法修改对象2。现在我们有:

#1 Instance of abc
    Values : Reference to #2

#2 Array
    [ 1 ]

Local variables
    self : Reference to #1
    lastval : Reference to #2
#1 Instance of abc
    Values : Reference to #2

#2 Array
    [ 1, 2, 3, 4 ]

Local variables
    self : Reference to #1
    lastval : Reference to #2
这种情况也在继续

lastval.append(2)
print "lastval 2 , ", lastval
print "self.Values 2 , ", self.Values
lastval.append(3)
print "lastval 3 , ", lastval
print "self.Values 3 , ", self.Values
lastval.append(4)
print "last val 4 ", lastval
print "self.Values 4 , ", self.Values
现在我们有:

#1 Instance of abc
    Values : Reference to #2

#2 Array
    [ 1 ]

Local variables
    self : Reference to #1
    lastval : Reference to #2
#1 Instance of abc
    Values : Reference to #2

#2 Array
    [ 1, 2, 3, 4 ]

Local variables
    self : Reference to #1
    lastval : Reference to #2
在这一点上,我们做了一些不同的事情:

lastval = []
这是对局部变量的赋值。它对反对#2没有任何作用。它会创建一个新数组。因此,最后我们有:

#1 Instance of abc
    Values : Reference to #2

#2 Array
    [ 1, 2, 3, 4 ]

#3 Array
    [ ]

Local variables
    self : Reference to #1
    lastval : Reference to #3
如您所见,lastval和self.Value现在引用不同的对象


要理解的重要一点是更新变量以引用不同对象和修改现有对象的区别。有关深入的讨论,请参见(该文档适用于Python 3,但Python 2和Python 3在这些概念上没有重大区别)。

这是非常详细的解释。。。我会确保保存您的回复这是非常详细的解释。。。我会确保保存您的回复