python dict,list 具有相同的实例 类

python dict,list has same instance for all classes

过去 3 个月我一直在研究 python 2.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() 实例。我也检查了 list[],它们的行为方式也相同。

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

您已将 children 定义为 class 变量而不是实例变量。如果您将其更改为实例变量,它将按照您的预期运行:

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

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

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

Example.children == Example().children
>>> True

想想在 class 中定义的全局变量的等价物,您就有了答案。


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

class Example(object):

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

现在 children 绑定到 class 实例 ,而不是 class 本身。这就是 self 的力量。