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,提问作者Михаил Сафаров
相关产品推荐
相关产品推荐

