1 分钟读懂:Python 参数传递机制

46 阅读2分钟

202512311727219441

每天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

img

  • b = a

img

  • a = 2

img

可变对象 和 不可变对象 的传递差异

1、不可变对象(intstrtuple 等 )

函数内赋值,会创建新对象,不会影响原变量:

def func(x):  
    x = 2  # 此时, x 指向新对象 2,原变量不受影响  

a = 1  
func(a)  
print(a)  # 输出 1
2、可变对象(listdictset 等 )

函数内修改对象内容(如 appendpop ),会影响原变量;但是,赋值新对象则不会。

################### 修改参数变量的内容
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开发 #程序员 #编程教程 #效率提升