全局变量作为python函数中的默认参数

时间:2020-07-02 09:55:01

标签: python global-variables default-arguments

我试图编写一个带有可选参数 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}")

1 个答案:

答案 0 :(得分:1)

定义函数时python中的行为如下:

  • 创建功能对象
  • 编译代码并将其存储在对象中
  • 请确保在您要启动函数时,运行代码所需的所有内容(例如变量)均可用

对于默认参数,它们存储在属性__defaults____kwdefaults__中。对于字符串,char,int或float这样的基本类型,它们将被复制到该位置。

因此,肯定的回答是“否”。您不能在此处强制python为您创建参考。但是,如果您只是想让代码更漂亮,那是可能的:

def display_target(tr=None):
    tr = tr or DEF_TARGET
    print(f"target is {tr}")