函数参数python的作用域

问题描述 投票:0回答:1

我有这个代码片段

def fun(i = []):
    print("i is", i)
    i.append(1)
    
for k in range(5):
    print("k is", k)
    fun()

及其输出

k is 0
i is []
k is 1
i is [1]
k is 2
i is [1, 1]
k is 3
i is [1, 1, 1]
k is 4
i is [1, 1, 1, 1]

我今天的理解是,对于每个函数调用,如果没有提供明确的值,参数将使用其默认值。但是在这里,即使在从循环中调用

i
时没有为
fun
提供任何值之后,您也可以看到
i
相对于先前的函数调用正在更新。

我期待这样的答案:

k is 0
i is []
k is 1
i is []
k is 2
i is []
k is 3
i is []
k is 4
i is []

我们在那个函数调用中没有函数参数的范围吗?

python function for-loop default-value
1个回答
0
投票

当心默认的可变参数!

Python 中函数的默认可变参数并不是每次调用函数时都真正初始化。相反,最近分配给它们的值被用作默认值。

避免由于可变参数引起的错误的常见做法是将 None 分配为默认值,然后检查是否有任何值传递给与该参数对应的函数。例子:

def some_func(default_arg=None):
    if default_arg is None:
        default_arg = []
    default_arg.append("some_string")
    return default_arg

来源:wtfpython

© www.soinside.com 2019 - 2024. All rights reserved.