You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

背后的原理:变量作用域与参数传递

  1. 变量作用域:Python遵循LEGB规则查找变量:

    • Local(局部):当前函数内定义的变量;
    • Enclosing(嵌套):外层嵌套函数的变量;
    • Global(全局):脚本顶层定义的变量;
    • Built-in(内置):Python自带的内置变量/函数。
      如果函数里没有用global声明,直接给变量赋值,Python会默认它是局部变量,和全局同名变量没关系。
  2. 参数传递机制:

    • 对于不可变对象(int、str、tuple等):传递的是值的副本,函数里修改副本不会影响原对象;
    • 对于可变对象(list、dict、自定义类实例等):传递的是对象的引用,函数里修改对象的内部内容,原对象会跟着变,但如果直接给参数重新赋值(比如accounts = {}),那还是修改的局部变量,和原对象无关。

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 22:30:52