Kar*_*rus 3 python function default-value python-2.7
假设我有一个foo采用默认参数的Python函数,该默认参数设置为某些全局变量。如果现在在调用函数之前更改该全局变量,则默认参数仍设置为该全局变量的原始值。
例如:
x = 1
def foo(a=x):
print a
x = 2
foo()
Run Code Online (Sandbox Code Playgroud)
打印1,而不是2。
我应该如何编写代码,以便可以更改此全局变量,并使其更新此默认参数?
默认变量仅求值并设置一次。因此,Python会创建引用的副本,从那时起,它将始终将该引用作为默认值传递。无需重新评估。
但是,您可以通过将另一个对象用作默认对象来解决此问题,然后使用一条if语句相应地替换它。就像是:
the_default = object()
x = 1
def foo(a = the_default):
if a is the_default:
a = x
print a
x = 2
foo()Run Code Online (Sandbox Code Playgroud)
注意,我们is用来执行引用相等。因此,我们检查它是否确实是default_object。您不应the_default在代码的其他地方使用该对象。
在许多Python代码中,它们None用作默认值(从而减少了构造对象的数量)。例如:
def foo(a = None):
if a is None:
a = x
print aRun Code Online (Sandbox Code Playgroud)
但是请注意,如果执行此操作,则程序无法区分用户调用foo()和用户调用,foo(None)而使用则the_object使用户更难获得对该对象的引用。如果None也将是一个有效的候选者,这将很有用:如果您不想foo(None)打印'None',则不要x。