【发布时间】:2020-08-13 19:43:01
【问题描述】:
我正在学习 Python,但我遇到了 gobal 变量的问题。我已经在全局范围内定义了变量,然后使用 global 关键字从函数中分配它们。但是,当它运行脚本时,它仍然无法分配变量。
看了这个解决方案,Using global variables in a function,我不知道为什么他的代码可以正常工作,而我的相同逻辑却失败了。几个小时都想不通并陷入小问题。
def player_input():
player_1_name = input('Please enter your name Player 1.')
player_2_name = input('Please enter your name Player 2.')
player_1_symbol='None'
player_2_symbol=''
allowed_symbol=['X','O']
symbol_accepted = False
def get_symbol():
global player_1_symbol
player_1_symbol = input('Please enter your preferred symbol {}. It can be either X or O. '.format(player_1_name))
print('value of symbol after assignment: '+ player_1_symbol)
def validate_symbol():
global symbol_accepted
print('value of symbol when process started: '+ player_1_symbol)
if player_1_symbol.upper() in allowed_symbol:
print('it passed')
symbol_accepted = True
else:
print('it came here, because it did not find the value of player_1_symbol')
get_symbol()
while symbol_accepted == False:
validate_symbol()
if player_1_symbol.upper() == 'O':
player_2_symbol = 'X'
else:
player_2_symbol = 'O'
print("{}, unfortunately you don't have choice. You have been assigned the symbol {}.".format(player_2_name,player_2_symbol))
我想要达到的结果是我想 assign player_1_symbol 从 get_symbol 函数到全局变量。 symbol_accepted 也是如此。没有变量被分配。我正在打印它们,但我无法理解为什么它不起作用。我在 youtube 上看到了一些视频和一些文章。
我看到了一些关于输入验证的其他视频/文章,但是一旦我开始这个,我想了解它有什么问题,以便我将来可以使用 global。
【问题讨论】:
-
你是什么意思他们没有被分配?请提供minimal reproducible example。注意,这只是一个函数定义,它永远不会在任何地方调用
-
注意,虽然
player_1_symbol在get_symbol中是全局的,但在player_input中是本地的,在validate_symbol中是非本地的。在任何情况下,无论如何你都不应该依赖全局可变状态 -
所以当我运行脚本时,变量
player_1_symbol首先被分配为X,但是当它到达它运行validate_symbol函数的点时,它的值是None。我希望它根据用户输入将值保持为X或O。 -
旁注:在
player_input()函数中定义player_1_symbol和player_2_symbol真的 没有用,因为您在运行时再次定义它们get_symbol()。第二条评论很好地解释了为什么不应该依赖单个 global 变量(太多的范围限制/堆栈中未使用的内存)。 -
作为一名程序员,您应该非常、非常、非常努力不使用全局变量。
标签: python input global-variables global variable-assignment