Python 的变量名和值之间的关系,这份材料讲得很清楚:
重点是:
- Python 中 name 是有作用域的(scoped,比如函数、块等),value 是全局的(global,因为放在堆中)
l = [1, 2, 3] # 在堆上会建立一个 [1, 2, 3] 的数组,带有引用计数 1 # l 被放入全局变量的词典 `globals()` 中, # 它的作用域是全局的(程序运行期不会失效),它指向堆上该数组的地址 def f(): x = l # x 也指向堆上数组的地址,同时该数组的引用计数加 1 # 函数退出后,x 的生命周期结束,该数组引用计数减 1 if __name__ == '__main__': f()
- 一个 name 只能指向一个 value,而多个 name 可以同时指向同个 value
- Python 的变量传递没有「传引用还是传值」之分,无论赋值还是函数参数传递,传的都是引用;只是引用的值,有 mutable 和 immutable 之分。Immutable 如数字、tuple 等,是无法被修改的
同时看看 Fluent Python 的 第八章。