【发布时间】:2020-02-07 08:13:57
【问题描述】:
自从我发现
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。
为什么会发生这些事情?如何处理默认参数值?
【问题讨论】:
-
bar在类范围内的特殊性问题与默认值问题有点正交。您需要了解的是,类主体不会形成封闭范围,这就是为什么您必须始终在类主体中定义的方法的函数主体内使用self.bar。还要注意,values 没有命名空间本身,相反,不同的命名空间可以引用相同的值。但是,默认值在函数定义时被评估一次,并且它们可以访问为您使用的任何表达式定义函数的范围 -
关于“命名空间”问题,如果您想知道函数的默认参数实际存储在哪里,也可以查看this page 并查找
__defaults__。
标签: python python-3.x arguments