值传递和引用传递
在 C++ 中,函数的参数传递分为值传递和引用传递。但在 Python 中,理论上所有的函数都是“引用传递”。不过,对于一些对象,它可能表现出类似于值传递的现象。
可变对象与不可变对象
不可变对象
Python 中,存在一些对象是不可变对象(Immutable),常见的不可变对象有:
- 整数
int、浮点数float、复数complex - 字符串
str - 元组
tuple当我们尝试对不可变对象进行赋值、原地修改(如+=操作)或参数传递时,Python 实际上返回了一个新的不可变对象。在函数传参时,这就表现得好像是“值传递”一般。
例如下述代码是不可变对象的传递:
def change_number(x):
print(f"函数内:x 的初始值为 {x}")
x = 100 # 这不是修改原来的 x,而是让函数内的本地变量 x 指向一个新的对象 100
print(f"函数内:x 改变后为 {x}")
my_number = 10
print(f"函数调用前:my_number 的值为 {my_number}") # my_number = 10
change_number(my_number)
print(f"函数调用后:my_number 的值为 {my_number}") # my_number = 10
可变对象
除去少数 Python 原生的类型,Python 大部分对象都是可变对象,包括自定义类的实例。
原地修改可变对象或传递参数时,其“地址”(或者说 Python 的 id)并不会改变,因此其看起来就像 C++ 的引用传递一样。
如果要创建新的不可变对象,我们必须使用 copy 或者 deepcopy 函数,参考:赋值与复制
BEYOND THE ARTICLE
读完了,有什么想法?
阅读已保存的问答示例,并循着引用回到原文。
— 本文完 — 返回文章列表