【问题标题】:Python function parameters [duplicate]Python函数参数[重复]
【发布时间】:2020-09-13 01:06:00
【问题描述】:

这个:

def f(i,values = [99]):
    values.append(i)
    print (values)

f(1)
f(2)

有这个结果:

[99, 1]
[99, 1, 2]

为什么每次调用函数时都没有将values(重新)设置为[99]? 我还以为是这样的:

def f(i):
    values = [99]
    values.append(i)
    print (values)

f(1)
f(2)

【问题讨论】:

标签: python list function scope


【解决方案1】:

因为列表是可变的。

传递给函数的参数绑定到对象,对象可以是可变的(如列表)或不可变的(如 Python 中的整数、字符串)。

与不可变类型(例如整数,在您的情况下 i 是第一个参数)不同,可变对象可以更改,事实上,每次您调用函数 f() 时,默认参数 values 都会发生突变。

所以发生的事情是,您首先定义了values=[99],而Python 将默认值[99]“保留”给函数

现在有了values.append(i),它正在函数内部发生变异(values 更改为[99,1],它也被作为默认值变异。

在documentation 中,明确表示在可变对象的情况下the default value is in effect modified

默认参数值是从左到右计算的,当 函数定义被执行。这意味着表达式是 在定义函数时评估一次,并且相同 “预计算”值用于每次调用。这尤其 了解默认参数何时是可变对象很重要, 例如列表或字典:如果函数修改了对象 (例如,通过将项目附加到列表中),默认值有效 修改的。这通常不是预期的。解决这个问题的方法 就是使用 None 作为默认值,并在正文中显式测试它 函数,例如:

可变值在某些情况下可能非常糟糕,对于默认值,请勿使用可变默认参数,除非绝对必要

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-11-12
    • 2020-12-12
    • 2015-09-01
    • 2014-10-13
    • 1970-01-01
    • 2011-03-31
    • 2018-10-17
    • 1970-01-01
    相关资源
    最近更新 更多