编程:从入门到放弃
    前言
    语言和环境
    +=
    C和C++
    Hex
    Map
    Scope(1):"这"是啥
    Scope(2)
    Singleton
    什么顺序
    从A到Z
    函数
    切分字符串
    初始化(1)
    初始化(2)
    单引号,还是双引号
    参数传递
    左,还是右
    引用
    时间(1)
    时间(2)
    时间(3)
    时间(4)
    时间(5)
    比大小
    流氓甘地
    相等,还是不等(1)
    相等,还是不等(2)
    相等,还是不等(3)
    相等,还是不等(4)
    第一个说了算,还是最后一个
    语言和环境
    除以0
    随机数

函数

Updated: 2022-04-25

入门。

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