【问题标题】:python dict,list has same instance for all classespython dict,list 对所有类都有相同的实例
【发布时间】:2016-08-22 19:11:36
【问题描述】:

我过去 3 个月一直在研究 python 2.7,今天注意到这一点后我真的很惊讶。

对于下面sn-p的代码

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 的这种行为及其背后的逻辑。这是某种设计缺陷还是我做错了什么并且应该退出编程?

【问题讨论】:

  • 是的,它是Example 类的静态成员。如果您希望它成为每个实例的成员,则需要将其附加到 self ,即在 __init__ 方法中将其定义为 self.children
  • 你使用了类变量。您必须为您的案例使用实例变量。在这里阅读:Class and Instance Variables
  • 为了让事情更复杂,如果你在代码中插入了这句话:Example.children['bar'] = 'foo',那么你会得到这个额外的输出:bar -> foo
  • @julivico 该链接很有帮助。谢谢

标签: python list class dictionary instance


【解决方案1】:

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

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

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

想想类中定义的全局变量的等价物,你就有答案了。


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

class Example(object):

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

现在children 绑定到类instance,而不是类本身。这就是self 的力量。

【讨论】:

  • 将有助于添加正确创建实例变量的代码示例
  • @JulienSpronc 当你发表评论时我正在这样做:)
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2022-06-25
    • 2014-03-25
    • 1970-01-01
    • 1970-01-01
    • 2014-03-10
    • 1970-01-01
    • 2012-04-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多