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
的力量。
过去 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
的力量。