【问题标题】:Python: Optional parameter, wrong default value [duplicate]Python:可选参数,错误的默认值[重复]
【发布时间】:2021-03-15 09:54:06
【问题描述】:

我有一个类似这个示例代码的代码:

default_var = "abc"

def set_default_var():
    global default_var
    default_var = "something different"

def ex_func(var1="", var2="", var3=default_var):
    print(var3)

set_default_var()
ex_func()
>>>abc

当我在参数列表中将 var3 设置为 default_var 时,我希望它具有值 "something different",当我调用函数而不指定 var3 。但是,打印显示我 “abc”。 即使在调试期间,调试器也会显示 default_var 设置为 "something different",但 var3 不是。这是一个错误,还是一个非常意外的功能?

谢谢!

【问题讨论】:

  • 此行为发生在 python 3.8.5 上用于复制目的
  • 函数的默认值在定义时评估:stackoverflow.com/q/1651154/2237151
  • var3 的默认值是标识符default_var 在评估时引用的任何值。你可以看到它是__defaults__('', '', 'abc'),而不是('', '', default_var)
  • 谢谢。我觉得很奇怪,在运行时没有评估该值,但也许它是一个性能问题。在调用函数时对函数的所有类型的参数执行此操作会大大降低性能。

标签: python python-3.x function


【解决方案1】:

默认值在定义函数时被评估和存储一次。每次调用函数时都不会重新检查它。这将按您的预期工作:

default_var = "abc"

def set_default_var():
    global default_var
    default_var = "something different"

def ex_func(var1="", var2="", var3=None):
    if var3 == None:
        var3 = default_var
    print(var3)

set_default_var()
ex_func()

【讨论】:

  • 是的,我自己就是这样解决的,谢谢。我觉得很奇怪,默认值仅在定义时进行评估。我原本预期的
  • 是的,这很容易出错。 很多 人使用可变类型作为默认值(例如,空列表),然后在函数中执行更改其值的操作,然后当这些更改持续到下一个函数时感到惊讶称呼。我认为考虑这一点的方法是 def 语句本身是可执行代码(具有定义函数的效果),并且在 def 运行时评估一次默认值,然后隐藏在函数定义。
  • 这是对我建议的观点的更完整的解释:stackoverflow.com/a/1651270/3830997
  • 感谢您的潜水,这听起来很合理。我来自 C#,据我所知,这根本不是问题,因此我预计会这样
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-24
  • 2011-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-08
相关资源
最近更新 更多