函数

Updated: 2018-12-30

入门

Python 函数的参数可以设默认值,比如这样一个简单的函数:

>>> def f(x, arr = []):
...     arr.append(x)
...     return arr
...

如果调用时不给arr,它将会使用默认的空数组

>>> f(2)
[2]

而如果给了arr则使用给定的数组:

>>> f(3, [1])
[1, 3]

坑!

当多次调用函数时,神奇的事情发生了:

>>> def f(x, arr = []):
...     arr.append(x)
...     return arr
...
>>> f(1)
[1]
>>> f(2)
[1, 2]

比较一下Javascript中的完全一样的函数:

> function f(x, arr=[]) {
... arr.push(x);
... return arr;
... }
undefined
> f(1)
[ 1 ]
> f(2)
[ 2 ]

进阶

Python 的 default argument 是在函数定义的时候计算的,这不同于其他语言(比如 Javascript或Ruby)在函数调用的时候计算,所以改变了 default argument 之后的调用也都会改变,这就是为什么最后一个调用f(4)的时候没有给arr赋值但arr却保留了之前的值[2,3]

为了防止这种情况出现,可以用下面这个方法:

def f(x, arr=None):
  arr = arr or []
  arr.append(x)
  return arr