python dict,list对所有类都有相同的实例

python dict,list对所有类都有相同的实例,python,list,class,dictionary,instance,Python,List,Class,Dictionary,Instance,我在过去3个月里一直在开发Python2.7,今天我注意到这一点,真的很惊讶 对于下面的代码片段 class Example: children = {} instance1 = Example() instance1.children['instance1_child1'] = 'Instance 1 child 1' instance2 = Example() instance2.children['instance2_child1'] = 'Instance 2 child 1

我在过去3个月里一直在开发Python2.7,今天我注意到这一点,真的很惊讶

对于下面的代码片段

class Example:
    children = {}

instance1 = Example()
instance1.children['instance1_child1'] = 'Instance 1 child 1'

instance2 = Example()
instance2.children['instance2_child1'] = 'Instance 2 child 1'
for key, value in instance2.children.items():
    print key + ' -> ' + value
为什么输出是

instance1_child1 -> Instance 1 child 1
instance2_child1 -> Instance 2 child 1
对于我正在创建的所有对象,似乎只有一个dict()实例。我也检查了列表[],他们的行为也一样


我无法理解python的这种行为以及背后的逻辑。这是某种设计缺陷还是我做错了什么,应该退出编程

您已将
子项
定义为类变量,而不是实例变量。如果改为将其更改为实例变量,则其行为将与您预期的一样:

class Example:
    def __init__(self):
        self.children = {}

instance1 = Example()
instance1.children['instance1_child1'] = 'Instance 1 child 1'

instance2 = Example()
instance2.children['instance2_child1'] = 'Instance 2 child 1'
for key, value in instance2.children.items():
    print key + ' -> ' + value

# Output: instance2_child1 -> Instance 2 child 1

通过在成员函数的上下文之外创建这些变量,您无意中创建了一个类变量

每个类实例都可以访问类变量,并且可以直接从类本身访问,而无需实例化

Example.children == Example().children
>>> True
想象一下类中定义的全局变量的等价物,你就有了答案


要更正此问题,只需将它们放在
\uuuu init\uuuu
的上下文中即可

class Example(object):

    def __init__(self):
        self.children = {}

现在,
子类
绑定到类实例,而不是类本身。这就是自我的力量

是,它是
示例
类的静态成员。如果希望它是每个实例的成员,则需要将其附加到self,即在
\uuuu init\uuu
方法中将其定义为
self.children
。您已经使用了类变量。您必须为您的案例使用实例变量。在这里阅读:为了使事情更加复杂,如果你在代码中插入了这句话:
示例。children['bar]='foo'
,那么你会得到这个额外的输出:
bar->foo
@julivico链接很有用。Thankswould有助于添加正确创建实例的代码示例variable@JulienSpronck当您评论时,我正在这样做:)