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

为何两段相同函数执行代码输出不一致?全局变量问题解析

全局变量在复合赋值中的意外覆盖问题

咱们来拆解下这个问题:为啥两段看起来类似的代码,执行结果却不一样?核心问题出在全局变量的求值时机和Python表达式的计算顺序上。

先看两段执行代码:

第一段执行代码(符合预期输出AB)

txt='' 
def test(): 
    global txt 
    txt+='A' 
    print(txt) 
    return 'B' 
tmp=test() 
print('tmp: ', tmp) 
txt+=tmp 
print(txt)

它的执行流程很清晰:

  • 初始化txt为空字符串
  • 调用test()时,函数通过global声明修改全局txt,把它变成'A',同时返回'B'给tmp
  • 最后执行txt += tmp,就是'A' + 'B',得到'AB',完全符合预期。

第二段执行代码(输出不符合预期)

txt='' 
def test(): 
    global txt 
    txt+='A' 
    print(txt) 
    return 'B' 
print(txt) 
txt+=test() 
print(txt)

问题就出在txt += test()这一行!在Python中,复合赋值+=本质上等价于txt = txt + test(),它的计算顺序是固定的:

  1. 先读取等号右侧的txt当前值:此时txt还是初始化的空字符串''
  2. 再执行test()函数:函数内部把全局txt改成了'A',还返回了'B'
  3. 拼接旧值和返回值:用第一步拿到的''加上'B',得到'B'
  4. 赋值给全局txt:把'B'重新赋值给txt,直接覆盖了函数里刚修改的'A'

所以最后打印的txt是'B',而不是预期的'AB'。

简单说,这个场景里全局变量的问题是:复合赋值表达式会先提前读取全局变量的旧值,后续函数对全局变量的修改会被表达式最终的赋值操作覆盖,相当于函数里的修改白做了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 03:28:09