为了演示我的问题,我有以下代码:
class Base(object):
def __init__(self):
self._base = [1,3]
@property
def base(self):
return self._base
gp = Base()
class Parent1(object):
def __init__(self):
self.gp = gp.base
def appendx(self):
self.gp.append(4)
return self.gp
class Parent2(object):
def __init__(self):
self.gp = gp.base
def appendx(self):
self.gp.append(7)
return self.gp
class First(Parent1, Parent2):
def __init__(self):
super(First, self).__init__()
class Second(Parent2, Parent1):
def __init__(self):
super(Second, self).__init__()
f = First()
s = Second()
# [First]
f.appendx()
print "f.gp = %s" %f.gp # f.gp = [1, 3, 4]
print "s.gp = %s" %s.gp # s.gp = [1, 3, 4]
# [Second]
a = s.appendx()
print "f.gp = %s" %f.gp # f.gp = [1, 3, 4, 7]
print "s.gp = %s" %s.gp # s.gp = [1, 3, 4, 7]
print "a = %s" %a # a = [1, 3, 4, 7]
# [Third]
gp.base[0] ="a"
print "f.gp = %s" %f.gp # f.gp = ['a', 3, 4, 7]
print "s.gp = %s" %s.gp # s.gp = ['a', 3, 4, 7]
print "a = %s" %a # a = ['a', 3, 4, 7]
# [Fourth] Confused from here on
a[0] ="b"
print "f.gp = %s" %f.gp # f.gp = ['b', 3, 4, 7]
print "s.gp = %s" %s.gp # s.gp = ['b', 3, 4, 7]
print "a = %s" %a # a = ['b', 3, 4, 7]
print "type(a) = %s" %type(a) # type(a) = <type 'list'>
我可以把头转到前三节,但我只是不明白,为什么要更新一个列表来更新其他所有内容。一些解释会有帮助。
发布于 2015-03-23 22:16:36
这就是在python中分配引用数组的变量的方式。
a = [1, 2, 3]
b = a
b.append(4)
a
和b
现在都将是[1, 2, 3, 4]
。第二行只复制对数组的引用,但不复制数组。在程序执行self.gp = gp.base
时,以及在返回对数组的引用的所有地方,都会发生同样的情况。程序中只有一个数组。
如果不希望所有对象共享同一个数组,则必须以某种方式复制该数组。如果你想要使用浅薄或深浅的拷贝,这取决于你。在How to clone or copy a list?有一个很长的解释。
发布于 2015-03-23 22:23:26
描述发生此错误的原因。
a = [1]
b = a
>>>print id(a), id(b)
3072113580 3072113580
也就是说,a
和b
都引用同一个对象。如果对任何列表的修改会导致对每个引用的variables
进行修改。
为了克服这一问题:
a = [1]
b = a[:] # copy list a to b
>>>print a, b
3053445164 3053960492
希望这能有所帮助
https://stackoverflow.com/questions/29221353
复制相似问题