首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >更新变量更新分配的类属性。

更新变量更新分配的类属性。
EN

Stack Overflow用户
提问于 2015-03-23 22:06:43
回答 2查看 33关注 0票数 0

为了演示我的问题,我有以下代码:

代码语言:javascript
运行
复制
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'>

我可以把头转到前三节,但我只是不明白,为什么要更新一个列表来更新其他所有内容。一些解释会有帮助。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-03-23 22:16:36

这就是在python中分配引用数组的变量的方式。

代码语言:javascript
运行
复制
a = [1, 2, 3]
b = a
b.append(4)

ab现在都将是[1, 2, 3, 4]。第二行只复制对数组的引用,但不复制数组。在程序执行self.gp = gp.base时,以及在返回对数组的引用的所有地方,都会发生同样的情况。程序中只有一个数组。

如果不希望所有对象共享同一个数组,则必须以某种方式复制该数组。如果你想要使用浅薄或深浅的拷贝,这取决于你。在How to clone or copy a list?有一个很长的解释。

票数 2
EN

Stack Overflow用户

发布于 2015-03-23 22:23:26

描述发生此错误的原因。

代码语言:javascript
运行
复制
a = [1]
b = a
>>>print id(a), id(b)
3072113580 3072113580

也就是说,ab都引用同一个对象。如果对任何列表的修改会导致对每个引用的variables进行修改。

为了克服这一问题:

代码语言:javascript
运行
复制
a = [1]
b = a[:] # copy list a to b
>>>print a, b
3053445164 3053960492

希望这能有所帮助

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29221353

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档