Python中如何让函数内修改的变量作用于外部脚本?
Python函数内修改变量并全局生效的方法与原理
首先看你代码里的两个问题:
- 函数里的
From - amount和To + amount只是做了计算,但没有把结果赋值给变量,等于白算; - 就算你加了赋值,因为
From和To是函数的参数,属于局部变量,修改它们不会影响全局的同名变量——Python里对整数这类不可变对象的参数传递,是传值的副本,函数里改的是副本,和原变量没关系。
下面给你几种可行的解决方法,按推荐程度排序:
方法1:用return返回修改后的值(最推荐)
这种方式不依赖全局变量,代码更清晰、无副作用,是Python的最佳实践。
From = 1000 To = 0 def transfer(From, To, amount): From -= amount # 赋值操作,把计算结果存回局部变量From To += amount return From, To # 返回修改后的两个值 # 接收返回值,重新赋值给全局的From和To From, To = transfer(From, To, 100) print(From) # 输出900
方法2:用global关键字声明全局变量
如果一定要直接修改全局变量,可以用global关键字告诉函数:“这个变量不是局部的,是全局作用域的那个”。
From = 1000 To = 0 def transfer(amount): global From, To # 声明要操作的是全局变量 From -= amount To += amount transfer(100) print(From) # 输出900
不过这种方式要谨慎用,全局变量多了会让代码逻辑变乱,不好维护。
方法3:用可变对象包装变量(比如字典/列表)
Python里可变对象(列表、字典等)的参数传递是传引用,函数里修改对象的内部元素,会直接影响原对象。
# 把两个变量放进字典里 accounts = {'From': 1000, 'To': 0} def transfer(accounts, amount): accounts['From'] -= amount accounts['To'] += amount transfer(accounts, 100) print(accounts['From']) # 输出900
背后的原理:变量作用域与参数传递
变量作用域:Python遵循LEGB规则查找变量:
- Local(局部):当前函数内定义的变量;
- Enclosing(嵌套):外层嵌套函数的变量;
- Global(全局):脚本顶层定义的变量;
- Built-in(内置):Python自带的内置变量/函数。
如果函数里没有用global声明,直接给变量赋值,Python会默认它是局部变量,和全局同名变量没关系。
参数传递机制:
- 对于不可变对象(int、str、tuple等):传递的是值的副本,函数里修改副本不会影响原对象;
- 对于可变对象(list、dict、自定义类实例等):传递的是对象的引用,函数里修改对象的内部内容,原对象会跟着变,但如果直接给参数重新赋值(比如
accounts = {}),那还是修改的局部变量,和原对象无关。
内容的提问来源于stack exchange,提问作者jxaiye
相关产品推荐
相关产品推荐

