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

为什么Python中函数外提前声明的变量会报“赋值前引用”错误?

问题原因

你遇到的报错确实是对Python作用域规则的误解导致的,核心逻辑如下:
Python在编译函数定义阶段,只要检测到函数内部存在对某个变量的赋值操作,就会默认将该变量识别为局部变量,哪怕外部存在同名的全局变量,函数运行时也会优先从局部作用域查找该变量。
你的代码中在playerTurn函数内部存在placesLeft = placesLeft - 1的赋值操作,这会让Python将placesLeft判定为局部变量,但是计算赋值符号右侧的值时需要读取placesLeft的取值,此时该局部变量还没有被赋值,因此抛出referenced before assignment报错。

解决方法

如果需要在函数内部修改全局变量的值,需要在函数开头用global关键字声明该变量属于全局作用域,修改后的代码示例如下:

placesLeft = 9

def playerTurn():
    global placesLeft
    whereToGo = int(input("Where would you like to place your piece? "))
    while True:
        if whereToGo in row1:
            row1.insert(whereToGo - 1, "X")
            del row1[whereToGo]
            placesLeft = placesLeft - 1

playerTurn()

补充说明

  • 若函数内部仅需要读取全局变量的值,不需要添加global声明,只有需要修改全局变量的绑定关系(也就是给变量本身赋值、改变它的指向)时才需要声明
  • 你代码中的row1同样是全局变量,但你仅对它调用insert、del方法修改内部元素,没有给row1本身赋值,因此不需要global声明也可以正常运行

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 21:36:04