【发布时间】:2020-07-02 09:55:01
【问题描述】:
我正在尝试编写一个带有可选参数tr的python函数,如果没有指定这个参数,那么我想取一个全局变量。
DEF_tARGET = "UserA"
def display_target(tr=DEF_TARGET):
print(tr)
问题是,当我在程序中的某处更改全局变量,然后调用不带 tr 参数的函数时,该函数仍采用初始值(函数声明时)全局变量。请看下面的例子:
DEF_TARGET = "UserA"
def display_target(tr=DEF_TARGET):
print(f"target is {tr}")
display_target("UserB") # prints UserB
DEF_TARGET = "UserB"
display_target()
输出
target is UserA
预期
target is UserB
我可以将函数声明如下,但我正在寻找更好的方法
def display_target(tr=None):
if not tr:
tr = DEF_TARGET
print(f"target is {tr}")
【问题讨论】:
-
不要使用
if not tr。使用if tr is None。除了None之外的很多东西都被评估为假(False、0、""等) -
使用基于
if tr is None的解决方案是standard answer for global as default parameter -
谢谢,所以默认变量只在函数声明时被评估和设置一次。
-
@TomKarzes 感谢您的注意。我实际上使用
tr = tr or DEF_TARGET,它的作用相同。 -
@Shadowfax 是的,这有完全相同的问题:如果
tr是False或0或""或其他任何评估为False的东西,你会忽略它并改用DEF_TARGET。如果您想要一个单行作业,请将其更改为tr = DEF_TARGET if tr is None else tr。
标签: python global-variables default-arguments