【问题标题】:undefined variable does not raise error if in scope of iteration with that name defined如果在定义了该名称的迭代范围内,未定义变量不会引发错误
【发布时间】: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.
  • namenot 未定义的,Python 范围规则首先查看本地,然后是封闭,最后是全局(和内置)命名空间。 name 存在于全局命名空间中

标签: python class dictionary scope cpython


【解决方案1】:

正如 cmets 中所说,确保返回属于 Foo 的每个实例的名称

    def __repr__(self):
        return self.name

以防止返回全局 name

另外,请务必使用correct method 来表示对象

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-29
    • 1970-01-01
    • 1970-01-01
    • 2021-10-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多