将默认参数定义为全局变量
Posted
技术标签:
【中文标题】将默认参数定义为全局变量【英文标题】:Defining a default argument as a global variable 【发布时间】:2017-07-31 19:50:45 【问题描述】:假设我有一个 Python 函数 foo
,它接受一个默认参数,其中该默认值设置为某个全局变量。如果我现在在调用函数之前更改该全局变量,默认参数仍设置为该全局变量的原始值。
例如:
x = 1
def foo(a=x):
print a
x = 2
foo()
这将打印1
,而不是2
。
我应该如何编写我的代码,以便我可以更改这个全局变量,并让它更新这个默认参数?
【问题讨论】:
默认参数只计算一次... 【参考方案1】:默认变量只评估和设置一次。因此 Python 制作了 引用的副本,从那时起,它总是将该引用作为默认值传递。没有进行重新评估。
但是,您可以通过使用 另一个对象 作为默认对象来解决此问题,然后使用 if
语句相应地替换它。比如:
the_default = object()
x = 1
def foo(a = the_default):
if a is the_default:
a = x
print a
x = 2
foo()
请注意,我们使用is
来执行引用相等。所以我们检查它是否确实是default_object
。您不应该在代码的其他地方使用 the_default
对象。
在许多 Python 代码中,它们使用 None
作为默认值(从而减少了构造对象的数量)。例如:
def foo(a = None):
if a is None:
a = x
print a
但是请注意,如果您这样做,您的程序将无法区分调用foo()
和foo(None)
的用户,而使用the_object
会使用户更难获得对该对象的引用。如果None
也是一个有效的候选者,这将很有用:如果您希望foo(None)
打印'None'
而不是x
。
【讨论】:
as the_deault 你可以只使用'None',除非 None 是参数的有效值 @CarloLobrano:是的。我在您撰写该评论的同时更新了答案。唯一的问题可能是您想要排除用户自己可以提供该对象的事实。通过使用the_object
之类的东西,您可以更好地防止这种行为。
没错。有时使用“默认对象”比使用“无”更明智以上是关于将默认参数定义为全局变量的主要内容,如果未能解决你的问题,请参考以下文章
默认形参和关键字实参,收集参数,命名关键字参数,return自定义返回,全局变量和局部变量,函数名的使用
python函数之默认参数 | 关键参数 | 全局变量 | return