Python 默认参数的陷阱

在 Python 中默认参数的使用一定要注意,并不是你想象中的那么完美!

0x00 默认参数的一般用法

我们在 Python 中默认参数使用和 C++ 中的方法类似,只需要在形参后做赋值操作即可,示例如下:

1
2
3
4
5
6
def f(k = 'v'): 
print(k)

f() # v
f('c') # c
f(k = 'a') # a

通过示例,已然了解默认参数的基本用法。

0x01 陷阱所在

下面先给出一个示例代码:

1
2
3
4
5
def f(l = []): 
l.append(1)
print(l)

f() # [1]

在这段函数中,定义了一个带默认值的参数,默认值是一个空列表,函数中对列表进行了追加操作,不用运行,一眼就能看出结果是 [1]
对上面代码进行更改:

1
2
3
4
5
6
7
def f(l = []): 
l.append(1)
print(l)

f() # [1]
f() # ???
f() # ???

第一个 f() 肯定是 [1],那第二个f() 和第三个 f() 结果如何?初学者肯定会认为这里的结果都一样。
尝试运行后,出乎意料地发现结果竟然是这样子:

1
2
3
[1]
[1, 1]
[1, 1, 1]

这是 为什么 呢?

原因如下:

由于所有函数调用都是引用了同一个默认参数,如果默认参数是可变类型的(list, dict), 函数中对其进行更改之后,再次调用该函数时默认参数将会是上次调用改变后的值。





root@kali ~# cat 重要声明
本博客所有原创文章,作者皆保留权利。转载必须包含本声明,保持文本完整,并以超链接形式注明出处【Techliu】。查看和编写文章评论都需翻墙,为了更方便地获取文章信息,可订阅RSS,如果您还没有一款喜爱的阅读器,不妨试试Inoreader.
root@kali ~# Thankyou!