包含一组对象的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: []>]>
您使用的是类属性(该值在实例中共享)。 更多关于这个:
在类中声明的变量,不附加到实例,是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