我知道自从我发现了python之后,python以不同的方式对待这个名称空间
def foo(l=[]):
l.append(1)
print(l)
foo()
foo()
foo([])
foo()
打印以下内容。你知道吗
[1]
[1,1]
[1]
[1,1,1]
所以我对它们作为对象初始化器的使用持怀疑态度。 最近我遇到了另一个类似的奇怪行为, 演示如下。你知道吗
class Foo:
bar = 0
def __init__(self):
self.a = bar
Foo()
这会引发异常,因为bar
未在此命名空间中定义。你知道吗
class Foo:
bar = 0
def __init__(self, a=bar)
self.a = a
Foo()
现在,它成功地将类变量foo
持有的值分配给初始化器内的对象a
。
为什么会发生这些事情?默认参数值是如何处理的?你知道吗
三个事实:
def
,这可能会令人惊讶。你知道吗第三点是最微妙的,也许与最初的预期相反。它记录在execution model(第4.2.2节)。姓名解析(英文):
这就是为什么在第二个示例中没有解析名称
bar
:注意,
bar
值0
仍然可以作为类属性从方法中访问:通过Foo.bar
或self.bar
。你知道吗现在,您应该了解最后一个示例的工作原理:
而且,考虑到上面的1-3点,你也应该能够正确地预测这里发生了什么:
在UnboundLocalError: local variable referenced before assignment why LEGB Rule not applied in this case中有关于怪异类作用域的更多信息。你知道吗
相关问题 更多 >
编程相关推荐