为何两段相同函数执行代码输出不一致?全局变量问题解析
全局变量在复合赋值中的意外覆盖问题
咱们来拆解下这个问题:为啥两段看起来类似的代码,执行结果却不一样?核心问题出在全局变量的求值时机和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(),它的计算顺序是固定的:
- 先读取等号右侧的
txt当前值:此时txt还是初始化的空字符串'' - 再执行
test()函数:函数内部把全局txt改成了'A',还返回了'B' - 拼接旧值和返回值:用第一步拿到的
''加上'B',得到'B' - 赋值给全局
txt:把'B'重新赋值给txt,直接覆盖了函数里刚修改的'A'
所以最后打印的txt是'B',而不是预期的'AB'。
简单说,这个场景里全局变量的问题是:复合赋值表达式会先提前读取全局变量的旧值,后续函数对全局变量的修改会被表达式最终的赋值操作覆盖,相当于函数里的修改白做了。
内容的提问来源于stack exchange,提问作者George Pamfilis
相关产品推荐
相关产品推荐

