Python中如何让被调用函数更新作为参数传入的父函数局部变量
Python函数间局部变量修改同步的解决方案
核心原理
Python中所有参数传递都是传对象引用:
- 你示例中用到的
int属于不可变类型,在function_2中对参数做+=操作时,本质是创建了新的int对象,和function_1中原变量指向的内存地址已经不同,所以修改不会同步到外层函数 - 只要让两个函数操作的是同一个可变对象的内部数据,就可以实现修改同步
方案1:用可变容器包裹不可变变量
这是改动最小的实现方案,把需要同步的不可变变量放到列表、字典这类可变容器中传入,修改容器的内部元素即可实现同步:
def function_1(): # 用列表包裹int变量,列表是可变对象 obj_list = [1, 2] function_2(obj_list) print("Original values add up to {}".format(obj_list[0] + obj_list[1])) def function_2(obj_list): obj_list[0] += 1 obj_list[1] += 2 print("Updated values add up to {}".format(obj_list[0] + obj_list[1])) if __name__ == '__main__': function_1()
运行结果:
Updated values add up to 6 Original values add up to 6
适用场景:需要同步的变量少,临时拆分逻辑不想改太多原有代码的场景。
方案2:用自定义类封装共享状态
如果需要同步的变量较多、逻辑关联性强,可以把变量封装为类的属性,传入类实例操作属性即可同步:
class SharedData: def __init__(self): self.object_1 = 1 self.object_2 = 2 def function_1(): data = SharedData() function_2(data) print("Original values add up to {}".format(data.object_1 + data.object_2)) def function_2(data): data.object_1 += 1 data.object_2 += 2 print("Updated values add up to {}".format(data.object_1 + data.object_2)) if __name__ == '__main__': function_1()
适用场景:共享变量多、相关逻辑复杂的工程化场景,代码可读性和可维护性更好。
方案3:返回修改后的值重新赋值(优先推荐)
如果没有硬性要求不能有返回值,这是最符合Python最佳实践的方案,没有隐式修改的副作用,逻辑更清晰易排查:
def function_1(): object_1 = 1 object_2 = 2 # 接收返回值重新赋值 object_1, object_2 = function_2(object_1, object_2) print("Original values add up to {}".format(object_1 + object_2)) def function_2(object_1, object_2): object_1 += 1 object_2 += 2 print("Updated values add up to {}".format(object_1 + object_2)) # 返回修改后的值 return object_1, object_2 if __name__ == '__main__': function_1()
适用场景:无特殊限制的所有场景,是Python官方推荐的写法,避免了可变对象隐式修改带来的调试难度。
内容的提问来源于stack exchange,提问作者AndrewE
相关产品推荐
相关产品推荐

