Python的函数传值与传引用简解

本文通过两个实例探讨Python中参数传递的机制,解释为什么基本类型和复杂类型在函数调用中的行为差异,并阐述Python中所有变量均为引用的概念。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Python到底值传值还是传引用?


先看两段代码

代码1:

1
2
3
4
5
6
7
>>> a = 3
>>>  def  f(b):
...     b = 1
...    
>>> f(a)
>>> a
3
代码2:

1
2
3
4
5
6
7
8
>>> a = [ 1 , 2 ]
>>>  def  f(b):
...     b[ 0 ] = 'a'
>>> a
[ 1 2 ]
>>> f(a)
>>> a
[ 'a' 2 ]

代码是网上抄来的,但是结果基本上是可信的。

于是可能会有人觉得Python是基本类型传值,而复杂类型是传引用。更有人甚至说全都是传引用balabala...


我的理解是,Python全部都是传值的,只是Python里面没有值,只有引用,所有的变量都是引用。

以C++的观点,可以认为Python里面函数都是传值的,而Python里面的所有值都是指针。Python统一管理所有的值。

比如说定义a=3,b=3,那么a和b其实都是引用,真正的值3在内存中只有一个空间。


以第一段代码为例:指针a指向了保存3这个字面值的那个空间,然后这个指针被以传值的方式传递给函数f,

由于是传值的方式传递函数的,所以a本身不会被传进来,而只是造了一个跟a值一样的指针,传入f。

在f中,这个临时造出来的指针被指向了一个新的空间,这个空间的字面值为1,当然没有对原来的指针a产生任何影响


再来说说第二段代码:指针a指向了一个数组的起始地址。然后这个起始地址被以值传递的方式传入函数f,

由于值传递产生的临时变量b和原来指针a的值是一样的,所以a[0]和b[0]指向的是同一个地址。所以修改

b[0]就等于修改了a[0]。


总的来说,python都是值传递的,而python里面所有的变量其实都是引用。

另外如果想从函数返回值,可以

def function(...):

    balabala...

    return (param1, param2, ...)


balabala

(param1, param2, ...) = function(...)

所有的返回值就都归为啦



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值