为什么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
相关产品推荐
相关产品推荐

