【问题标题】:global variable as default argument in python function全局变量作为python函数中的默认参数
【发布时间】: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 之外的很多东西都被评估为假(False0"" 等)
  • 使用基于if tr is None的解决方案是standard answer for global as default parameter
  • 谢谢,所以默认变量只在函数声明时被评估和设置一次。
  • @TomKarzes 感谢您的注意。我实际上使用tr = tr or DEF_TARGET,它的作用相同。
  • @Shadowfax 是的,这有完全相同的问题:如果 trFalse0"" 或其他任何评估为 False 的东西,你会忽略它并改用DEF_TARGET。如果您想要一个单行作业,请将其更改为 tr = DEF_TARGET if tr is None else tr

标签: python global-variables default-arguments


【解决方案1】:

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

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

对于默认参数,它们存储在属性__defaults____kwdefaults__ 中。对于字符串、char、int 或 float 等基本类型,它们会被复制到此位置。

所以最终的回答是否定的。您不能强制 python 在此处为您创建引用。但是如果你只是想让你的代码更漂亮,那是可能的:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-02-01
    • 2017-07-31
    • 2020-10-28
    • 2020-08-05
    • 2016-07-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多