将默认参数定义为全局变量

时间:2017-03-10 12:51:12

标签: python python-2.7 function default-value

假设我有一个Python函数foo,它接受​​一个默认参数,其默认值设置为某个全局变量。如果我现在在调用函数之前更改了该全局变量,则默认参数仍设置为该全局变量的原始值。

例如:

x = 1

def foo(a=x):
    print a

x = 2
foo()

这会打印1,而不是2

我应该如何编写代码,以便我可以更改此全局变量,并让它更新此默认参数?

1 个答案:

答案 0 :(得分:5)

默认变量仅评估并设置一次。所以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