包含一组对象的Python对象很奇怪

可能重复:
Python中的静态类变量
Python OOP和列表

只是想知道我能否在这方面得到一些帮助。

我正在使用python,并遇到了一个障碍,我似乎无法弄清楚我正在开发的一个小程序。 这是我的问题(使用一个非常简单和不相关的例子):我有一个类:

class dog:
    name = ''
    friends = []

我从中创建了一些对象:

fido = dog()
rex = dog()

这里是我卡住的地方。 我不知道为什么会发生这种情况,我还没有弄明白。 我假设我对事物的理解是有缺陷的,但任何解释都会很棒。 所以这里是我的问题,如果我追加一个对象到另一个(这看起来应该工作得很好):

fido.friends.append(rex)

事情搞砸了。 正如你可以在这里看到的:

>>> fido.friends.append(rex)
>>> fido.friends
[<__main__.dog instance at 0x0241BAA8>]
>>> rex.friends
[<__main__.dog instance at 0x0241BAA8>]
>>> 

这对我来说并不合适。 fido.friends不仅应该有什么东西吗? 即使我做了一个新的对象:

rover = dog()

它里面有一个狗实例,我们可以看到它是我们的'rex'对象。

>>> rex.name = "rex"
>>> fido.friends[0].name
'rex'
>>> rex.friends[0].name
'rex'
>>> rover.friends[0].name
'rex'
>>> 

这只是没有道理,我很乐意提供帮助。 我搜索了一段时间试图找到一个解释,但没有。 对不起,如果有一个类似的问题,我错过了。


如果每只狗都有自己的朋友列表,则必须使用实例属性:

class Dog(object):

    family = 'Canidae' # use class attributes for things all instances share 

    def __init__(self, name):
        """ constructor, called when a new dog is instantiated """
        self.name = name
        self.friends = []

    def __repr__(self):
        return '<Dog %s, friends: %s>' % (self.name, self.friends)

fido = Dog('fido')
rex = Dog('rex')

fido.friends.append(rex)
print(fido) # <Dog fido, friends: [<Dog rex, friends: []>]>

您使用的是类属性(该值在实例中共享)。 更多关于这个:

  • http://www.diveintopython.net/object_oriented_framework/class_attributes.html

  • 在类中声明的变量,不附加到实例,是python中的静态变量。


    为了避免这种情况,请将变量声明放在__init__函数中,如下所示:

    class Dog:
        def __init__(self):
            self.name = ''
            self.friends = []
    
    链接地址: http://www.djcxy.com/p/78765.html

    上一篇: Python object containing an array of objects being weird

    下一篇: Static member of a function in Python ?