将默认参数定义为全局变量
Defining a default argument as a global variable
假设我有一个 Python 函数 foo
,它接受一个默认参数,其中默认设置为某个全局变量。如果我现在在调用函数之前更改该全局变量,则默认参数仍设置为该全局变量的原始值。
例如:
x = 1
def foo(a=x):
print a
x = 2
foo()
这会打印 1
,而不是 2
。
我应该如何编写我的代码,以便我可以更改这个全局变量,并让它更新这个默认参数?
默认变量仅计算并设置一次。因此 Python 复制了一个 引用 并且从那时起,它总是将该引用作为默认值传递。没有重新评估。
然而,您可以通过使用 另一个对象 作为默认对象来解决这个问题,然后使用 if
语句相应地替换它。类似于:
<b>the_default = object()</b>
x = 1
def foo(a = <b>the_default</b>):
if a <b>is</b> the_default:
a = x
print a
x = 2
foo()
注意我们使用is
来执行引用相等。所以我们检查它是否确实是 default_object
。您不应在代码的其他地方使用 the_default
对象。
在许多 Python 代码中,它们使用 None
作为默认值(因此减少了构造对象的数量)。例如:
def foo(a = <b>None</b>):
if a <b>is</b> None:
a = x
print a
但是请注意,如果您这样做,您的程序将无法区分调用 foo()
和 foo(None)
的用户,而使用 the_object
会使用户更难获取对该对象的引用。如果 None
也是一个有效的候选者,这将很有用:如果您希望 foo(None)
打印 'None'
而不是 x
.
假设我有一个 Python 函数 foo
,它接受一个默认参数,其中默认设置为某个全局变量。如果我现在在调用函数之前更改该全局变量,则默认参数仍设置为该全局变量的原始值。
例如:
x = 1
def foo(a=x):
print a
x = 2
foo()
这会打印 1
,而不是 2
。
我应该如何编写我的代码,以便我可以更改这个全局变量,并让它更新这个默认参数?
默认变量仅计算并设置一次。因此 Python 复制了一个 引用 并且从那时起,它总是将该引用作为默认值传递。没有重新评估。
然而,您可以通过使用 另一个对象 作为默认对象来解决这个问题,然后使用 if
语句相应地替换它。类似于:
<b>the_default = object()</b>
x = 1
def foo(a = <b>the_default</b>):
if a <b>is</b> the_default:
a = x
print a
x = 2
foo()
注意我们使用is
来执行引用相等。所以我们检查它是否确实是 default_object
。您不应在代码的其他地方使用 the_default
对象。
在许多 Python 代码中,它们使用 None
作为默认值(因此减少了构造对象的数量)。例如:
def foo(a = <b>None</b>):
if a <b>is</b> None:
a = x
print a
但是请注意,如果您这样做,您的程序将无法区分调用 foo()
和 foo(None)
的用户,而使用 the_object
会使用户更难获取对该对象的引用。如果 None
也是一个有效的候选者,这将很有用:如果您希望 foo(None)
打印 'None'
而不是 x
.