Python 对函数默认参数的处理

Python 对函数默认参数的处理

一个以可变对象为默认参数的函数:

1
2
3
4
5
6
7
8
9
10
11
class A:
def __init__(self):
self.x = 1
print('created')

def f(a = A()):
a.x += 1
print(a.x)
# output: created
f() # output: 2
f() # output: 3

从结果可以看出,Python 在解析时便已经创建好了默认参数 a 的值。函数 f 在调用时采用了同一个对象,而不是每次调用时重新创建新的对象。这一点与 C++ 的处理方式不同。

初看 CPython

什么是 CPython

简单的说, CPython 是 Python 解释器的一个实现。换句话说,Python 解释器是由 C 写的,然后由 GCC 之类的编译器编译而成的可执行文件。除了 CPython,还有 PyPy(用 Python 实现的 Python 解释器),Skulpt(用 JavaScript 实现的 Python 解释器) 等等。如果你不知道你用的是哪一个,那么你一定用的就是 CPython。因为 CPython 是 Python 官方的解释器实现,其它均属于第三方实现。

从源码到运行

对于从 Python 源码到解释器执行它们的这个过程,我把它分为两大步 —— 编译(Compiling) 与 解释(Interpreting)。

延迟计算: 关于 Python 的 yield

在 SICP 第 3 章中,有一段部分内容是以 stream 为核心而展开的。而 stream 的特点就是 lazy evaluation / delayed evaluation (惰性求值 / 延迟计算)。在接触 stream 之时,我便立即联想到 Python 具有类似的功能 — yield