【发布时间】:2020-08-02 12:36:25
【问题描述】:
使用 CPython 3.8.2+ (984a5,执行以下代码不会引发错误。 结果是一个字典,它的打印就好像它的值是存储了相同值的实例一样。
class Foo(object):
def __init__(self, name):
self.name = name
def __repr__(self):
return name # this is undefined (missing `self.`)
optable = dict()
for name in ['a', 'b']:
optable[name] = Foo(name)
print(optable)
print(optable['a'].name)
print(optable['b'].name)
这个脚本打印
{'a': b, 'b': b}
a
b
出乎意料的是,两种表示都被打印出来了,并且都是“b”。
这可能是 CPython 错误吗?
【问题讨论】:
-
name是从全局范围中提取的,它由for循环定义和分配。请改用for item in ['a', 'b']:。 -
附加discussion.
-
name是 not 未定义的,Python 范围规则首先查看本地,然后是封闭,最后是全局(和内置)命名空间。name存在于全局命名空间中
标签: python class dictionary scope cpython