You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

Python列表函数传参:传引用与传值的区别及场景问询

理清Python列表作为函数参数的传递逻辑

嘿,我来帮你解开这个困惑!很多刚接触Python的朋友都会在“传值还是传引用”这里绕晕,其实Python的参数传递逻辑和传统的两种方式都不一样,咱们结合你的例子慢慢说。

首先明确核心:Python里的参数传递是传对象的引用(pass-by-object-reference),不是严格意义上的传值或传引用。每个变量其实都是指向某个对象的“标签”,函数参数传递的是这个标签的副本——注意,是标签的副本,不是对象的副本。

咱们先看你的test函数:

def test(my_list):
    for i in range(len(my_list)):
        my_list[i] = 5

当你调用test(original_list)时,函数里的my_list和外部的original_list是两个不同的标签,但它们指向同一个列表对象。你在函数里做的my_list[i] = 5,是直接修改这个共享对象的内容——就像两个人拿着同一个房子的钥匙,其中一个人进去把家具换了,另一个人再开门看,家具当然变了。所以外部的列表会跟着改变,这就给了你“传引用”的感觉。

再来说你提到的test2函数(我猜它的逻辑应该是给参数重新赋值,比如下面这样):

def test2(my_list):
    my_list = [5,5,5]  # 重新绑定到一个新列表

这时候,函数里的my_list一开始也是指向外部的原列表,但当你执行my_list = [5,5,5]时,你是把这个标签重新贴到了一个新创建的列表对象上。外部的original_list标签还贴在原来的列表上,所以外部看不到任何变化——这就给了你“传值”的错觉,但本质是你在函数内部改了标签的指向,和原对象没关系了。

总结一下关键规则:

  • 如果你在函数里修改对象本身的内容(比如列表的元素、字典的键值对、对象的属性),外部的对象会同步变化,因为操作的是同一个对象。
  • 如果你在函数里给参数变量重新赋值(比如my_list = 新列表my_list = 10),这只是改变了函数内部变量的指向,和外部变量指向的对象毫无关系。

用个更形象的比喻:把对象比作一栋房子,变量就是写着房子地址的纸条。函数参数传递的是这张纸条的复印件——

  • test函数是拿着复印件找到房子,进去把墙刷成了黄色,原纸条对应的房子自然也变成黄色了。
  • test2函数是把复印件上的地址改成了另一栋新房子,原纸条上的地址还是老房子,老房子当然不会有任何变化。

希望这个解释能帮你搞清楚这个逻辑,要是还有疑问随时问!

内容的提问来源于stack exchange,提问作者Hamed Salimian

火山引擎 最新活动