python dict,list对所有类都有相同的实例
我在过去3个月里一直在开发Python2.7,今天我注意到这一点,真的很惊讶 对于下面的代码片段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
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当您评论时,我正在这样做:)