如何通过patato函数修改变量a的值(附Python示例代码)
问题原代码
def patato(a): a += 1 def tomato(): a = 0 patato(a) print(a) tomato()
上述代码运行后输出为0,patato函数没有成功修改tomato函数内的变量a。
失效原因
Python传参走的是对象引用传递,且整数是不可变类型:
- 调用
patato(a)时,只是把tomato内a指向的整数0的引用,复制给了patato的形参(本质是函数内部的局部变量) - 执行
a += 1时,因为整数不能原地修改,Python会生成一个值为1的新整数对象,让patato内部的局部a指向这个新对象,和tomato里的a完全没有关系了。
正确实现方法
最规范、可维护性最高的写法是让patato返回修改后的值,调用时用原变量接收返回值:
def patato(a): a += 1 return a def tomato(): a = 0 a = patato(a) print(a) tomato()
运行后输出1,符合修改预期。
如果一定要在不返回值的前提下实现修改(非常不推荐,会引入隐式副作用,大幅提升后续排查问题的成本),可以用可变类型(比如列表、字典)承载要修改的值,因为可变对象的修改是原地生效的:
def patato(a_container): a_container[0] += 1 def tomato(): a = [0] # 把值放在可变列表里 patato(a) print(a[0]) tomato()
日常写代码优先选返回值赋值的方案,不要为了少写一行return搞隐式修改,后面踩坑的概率极高。
内容的提问来源于stack exchange,提问作者levitomato
相关产品推荐
相关产品推荐

