下面是一份修复后的版本。主要改动:
- 删除所有失效链接和纯外链引用;
- 将 Python 2 相关内容更新为 Python 3;
- 修正原文中容易误导或错误的表述;
- 代码统一为 Python 3 可运行;
- 保留原文档结构,但做了精简和勘误。
Python 语言特性(Python 3 修复版)#
1. Python 的函数参数传递#
Python 的参数传递既不是“值传递”,也不是“引用传递”,而是 对象引用传递(call by object reference)。
- 变量名只是对象的引用;
- 函数收到的是引用的副本;
- 如果对象不可变(int、str、tuple、frozenset),函数内重新赋值不会影响外部;
- 如果对象可变(list、dict、set),函数内原地修改会影响外部。
a = 1
def fun(a):
a = 2
fun(a)
print(a) # 1
a = []
def fun(a):
a.append(1)
fun(a)
print(a) # [1]用 id 观察:
a = 1
def fun(a):
print("func_in", id(a))
a = 2
print("re-point", id(a), id(2))
print("func_out", id(a), id(1))
fun(a)
print(a) # 1不可变对象重新赋值后,引用指向新对象;可变对象原地修改时,引用不变。
2. Python 中的元类(metaclass)#
元类是“创建类的类”。默认情况下,type 就是所有类的元类。元类常用于 ORM、框架等需要控制类创建过程的场景。日常业务开发很少直接使用。
