如何解决Python基础作用域问题:函数返回变量无法全局访问
问题分析:为什么最后一行的print语句无法运行?
这是Python作用域规则在起作用,我来给你拆解清楚:
- 函数
assignchar()里的player1和player2是局部变量,它们的“生命周期”只限于函数内部——函数执行完毕后,这些变量就会被Python回收,全局作用域根本“看不到”它们。 - 虽然你在函数末尾返回了这两个值,但调用函数时只写了
assignchar(),没有把返回的结果保存到全局变量里,相当于返回的值直接被丢弃了,自然没法在后面的print里使用。
解决方法一:接收函数返回值并赋值给全局变量
修改调用函数的代码,把返回的元组解包成全局变量,这样后面的print就能正常访问了:
def assignchar(): assigning = True player2 = "" while assigning: player1 = input("Player 1: Do you want to be X or O? ") if player1.upper() == 'X': player1 = 'X' player2 = 'O' assigning = False elif player1.upper() == 'O': player1 = 'O' player2 = 'X' assigning = False else: print('Please select X or O.') print(f'Player 1 is {player1}') print(f'Player 2 is {player2}\n') return(player1, player2) # 关键:接收函数返回的元组,赋值给全局的player1和player2 player1, player2 = assignchar() print(player1 + " and " + player2)
解决方法二:在其他函数中使用时传递参数
如果你的需求是在另一个函数里使用这两个变量,更推荐把返回值作为参数传递过去,而不是依赖全局变量(全局变量容易让代码逻辑变得混乱,后期维护成本高):
def assignchar(): # 函数内容和之前一致 assigning = True player2 = "" while assigning: player1 = input("Player 1: Do you want to be X or O? ") if player1.upper() == 'X': player1 = 'X' player2 = 'O' assigning = False elif player1.upper() == 'O': player1 = 'O' player2 = 'X' assigning = False else: print('Please select X or O.') print(f'Player 1 is {player1}') print(f'Player 2 is {player2}\n') return(player1, player2) # 定义需要使用这两个变量的函数 def play_game(p1_char, p2_char): print(f"Game starting! Player 1 uses {p1_char}, Player 2 uses {p2_char}") # 先获取返回值,再传递给目标函数 p1, p2 = assignchar() play_game(p1, p2)
避坑提醒
尽量别用global关键字强行把局部变量变成全局变量——这种写法会让代码的逻辑变得不清晰,后期维护起来很麻烦,除非你有特别的场景需求。
内容的提问来源于stack exchange,提问作者Broeskoenoe
相关产品推荐
相关产品推荐

