为何triple函数未执行正确数学运算 如何调整代码使输出从5变为15
核心原因
你看到程序输出5的本质是Python针对不可变类型的传参机制:
Python中的整数属于不可变对象,当把外部变量作为参数传入函数时,函数形参会获得一份独立的值拷贝,和外部的原变量不存在内存绑定。原代码的逐行执行逻辑:
- 在
main函数中定义局部变量num,赋值为5 - 调用
triple(num)时,只是把num存储的数值5传递给triple的形参,两个作用域下的num是完全独立的局部变量 triple内部执行num = 3 * num时,只是给自身作用域的局部num重新赋值为15,不会改动main作用域下的num值- 回到
main执行打印操作时,读取的还是原作用域下值为5的num,因此最终输出5。
调整为输出15的实现方案
推荐写法:通过函数返回值传递计算结果
这是最符合Python编码规范、可读性最高的实现方式,无额外副作用:
def main(): num = 5 # 接收triple返回的计算结果,重新赋值给本地变量 num = triple(num) print(num) def triple(num): # 直接返回三倍计算的结果 return 3 * num main()
运行上述代码即可稳定输出15。
非推荐写法:借助可变容器传递不可变值
如果刻意要保持原函数“直接修改传入值”的逻辑,因为整数无法原地修改,需要把数值包裹在列表、字典这类可变容器中传递:
def main(): # 用单元素列表包装原始数值 num = [5] triple(num) print(num[0]) def triple(num): # 修改可变容器内存储的元素,会同步影响外部的容器引用 num[0] = 3 * num[0] main()
注意:不要尝试在triple函数中通过global num关键字修改变量值,这种写法会把原本的局部变量提升为全局变量,造成不必要的全局状态污染,不符合函数封装的设计原则。
这类写法会引入不必要的复杂度,日常开发中不建议使用。
内容的提问来源于stack exchange,提问作者QuantumAgent
相关产品推荐
相关产品推荐

