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

Python全局变量正确声明方法?井字棋代码UnboundLocalError解惑

问题原因

你碰到的UnboundLocalError是Python作用域规则导致的:如果函数内部存在对某个变量的赋值操作(哪怕赋值语句写在引用之后),Python会默认把这个变量认定为局部变量,而非全局变量。这就导致你在print语句里引用player时,Python会去找局部的player,但此时它还没被赋值,所以触发报错。

举个你代码的典型场景例子:

player = 'X'  # 全局变量

def greet():
    print(f"Player {player}, make your move (row column): ")
    # 后面有切换玩家的赋值操作
    player = 'O'

这里函数里的player = 'O'让Python把player标记为局部变量,前面的print引用时,局部的player还没定义,自然报错。

正确声明全局变量的方法

分两种情况处理:

  • 仅读取全局变量:如果函数里只是读取全局变量的值,不需要额外声明,直接使用即可。
  • 修改全局变量:如果要在函数内部修改全局变量,必须在函数开头用global关键字明确声明这个变量是全局的。

对应你的井字棋场景,正确写法应该是这样:

player = 'X'  # 全局变量

def greet():
    global player  # 声明要使用全局的player变量
    print(f"Player {player}, make your move (row column): ")
    # 安全切换玩家(修改全局变量)
    player = 'O' if player == 'X' else 'X'
为什么移到函数内循环前能正常运行?

当你把player = 'X'移到greet()函数的循环前,这个变量就变成了函数的局部变量,print语句执行前它已经完成赋值,自然不会出现“引用前未赋值”的错误,但此时它已经不是全局变量了,只能在该函数内部访问。

内容的提问来源于stack exchange,提问作者Михаил Сафаров

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 19:36:11