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

Python中函数内修改全局作用域变量未按预期生效是什么原因?

问题原因

Python的作用域规则默认在函数内部对变量做赋值操作时,会将该变量识别为函数专属的局部变量,和全局作用域下同名的computer_symbol是两个完全独立的变量:

  • 你在choose_symbol里给computer_symbol赋值的操作,只是修改了函数内部的局部变量值,全局的同名变量不会被更新
  • 你之前未提前声明全局变量就直接在函数外访问computer_symbol时报错,是因为函数内部的局部变量仅在函数执行周期内生效,外部作用域无法访问
解决方法

方法1:用global关键字声明操作全局变量

在choose_symbol函数开头添加global声明,明确告知Python你要修改的是全局作用域的computer_symbol,而非新建局部变量:

def choose_symbol(user_symbol):
    # 声明此处操作的是全局变量computer_symbol
    global computer_symbol
    if user_symbol == 'X':
        computer_symbol = 'O'
    else:
        computer_symbol = 'X'
    return computer_symbol

方法2:直接接收函数返回值(更推荐)

你的choose_symbol本身已经返回了计算好的电脑符号,直接将返回值赋值给全局变量即可,不需要修改函数内部逻辑,也避免了全局变量隐式修改的问题:
把原代码中调用choose_symbol的行

choose_symbol(user_symbol)

改为

computer_symbol = choose_symbol(user_symbol)
补充说明

你可能会疑惑为什么board_locations在draw_board等函数中修改不需要加global?因为你是对列表这个可变对象的内部元素做修改,不是对board_locations这个变量名本身做重新赋值,Python会默认使用全局的列表对象,只有对变量名做赋值操作时才会触发局部变量的判定。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 02:06:11