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

