每天1分钟,轻松懂 Python
这是一份有基础、有深度的 Python 核心技术手册
参数传递的本质:赋值传递
1、赋值传递 与 值传递、引用传递 的区别
值传递(如 C++ ):值传递是在传递过程中复制出一个副本进行传递,不影响原变量。
引用传递(如 C++ 引用):函数内变量与原变量共享内存,传递过程中不发生复制。
Python 赋值传递(对象的引用传递):函数参数传递时,只是让新变量与原变量指向相同的对象而已,并不存在值传递或是引用传递一说。
这里,若对象可变,修改函数内变量会影响原变量;若不可变,会创建一个新对象 。
def func1(b):
b = 2 # int 型不可变,此时,会创建新对象。
print(f"func1.b = {b}")
a = 1
func1(a) # out: func1.b = 2
print(f"a = {a}") # out: a = 1
2、Python 变量与赋值原理
变量是 “对象引用”
赋值是让变量指向新对象,而非修改对象本身。
a = 1 # a 指向对象 1
b = a # b 也指向对象 1
a is b # True
a = 2 # 此时,a 改为指向对象 2,但 b 仍指向对象 1
a is b # False, 此时,a = {int} 2;b = {int} 1
赋值流程图
a = 1
b = a
a = 2
可变对象 和 不可变对象 的传递差异
1、不可变对象(int、str、tuple 等 )
函数内赋值,会创建新对象,不会影响原变量:
def func(x):
x = 2 # 此时, x 指向新对象 2,原变量不受影响
a = 1
func(a)
print(a) # 输出 1
2、可变对象(list、dict、set 等 )
函数内修改对象内容(如 append、pop ),会影响原变量;但是,赋值新对象则不会。
################### 修改参数变量的内容
def func(lst):
lst.append(4) # 修改原列表内容,原变量会受影响
a = [1, 2, 3]
func(a)
print(a) # 输出 [1, 2, 3, 4]
################### 给参数,赋值新对象
def func_new(lst):
lst = [1, 2, 3, 4] # lst 指向新列表,原变量不受影响
func_new(a)
print(a) # 输出 [1, 2, 3, 4](因前一个函数已修改内容)
-------- 写在最后 --------
关注我,每天1分钟,轻松懂 Python
我的同名公众号正在连载《FastAPI 开发实战》、《Python 核心技术》、《职场》。
点赞 :如果觉得有收获,点赞支持一下吧!
分享 :分享给身边同样对Python感兴趣的朋友!
关注我 :不要错过每一篇 Python 实战内容!
#Python #FastAPI #API #Web开发 #程序员 #编程教程 #效率提升