Python 尝试从函数赋值时,全局变量不起作用

Python 尝试从函数赋值时,全局变量不起作用,python,input,global-variables,global,variable-assignment,Python,Input,Global Variables,Global,Variable Assignment,我正在学习Python,我对gobal变量有问题。我已经全局定义了变量,然后使用global关键字从函数中分配它们。但是,当它运行脚本时,仍然无法分配变量 看了这个解决方案,我不知道为什么他的代码能工作,而我的逻辑却失败了。搞不懂,在这个小问题上纠缠了好几个小时 def player_input(): player_1_name = input('Please enter your name Player 1.') player_2_name = input('Please en

我正在学习Python,我对gobal变量有问题。我已经全局定义了变量,然后使用global关键字从函数中分配它们。但是,当它运行脚本时,仍然无法分配变量

看了这个解决方案,我不知道为什么他的代码能工作,而我的逻辑却失败了。搞不懂,在这个小问题上纠缠了好几个小时

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))
我试图实现的结果是,我想将player_1_symbol分配给get_symbol函数中的全局变量。符号_也一样。没有一个变量被赋值。我正在打印它们,但我不明白为什么它不起作用。我在youtube上看到了一些视频和一些文章


我看了一些关于输入验证的其他视频/文章,但一旦开始,我想知道它有什么问题,以便将来可以使用global。

我创建了一个带有播放器符号的数组,播放器1为0,播放器2为1,这样可以正确分配变量。我还修复了一个bug,其中validate_symbol重复出现,因为symbol_accept有相同的错误

def播放器_输入: player_1_name=输入‘请输入您的姓名player 1’ player_2_name=输入‘请输入您的姓名player 2’ 玩家符号=[,] 允许的_符号=['X','O'] 符号_已接受=错误 def get_符号: 播放器符号[0]=输入 '请输入您的首选符号{}。它可以是X或O。格式播放器的名称 打印“分配后的符号值:”+玩家符号[0] def validate_symbolsymbol_已接受: 打印“进程启动时符号的值:”+玩家符号[0] 如果玩家\u符号[0]。允许的\u符号中的上限: 打印“它通过了” 符号_接受=真 其他: 打印“它出现在这里,因为它没有找到玩家\u 1\u符号的值” 获取\u符号 返回符号\u已接受 当符号_接受==False时: symbol_已接受=验证symbol symbol_已接受 如果玩家_符号[0]。上限=='O': 玩家符号[1]=“X” 其他: 玩家符号[1]=“O” 打印{},很遗憾您没有选择。您已被分配符号{}..formatplayer_2_name, 玩家符号[1] 播放器输入
你说他们没有被分配是什么意思?请提供一份报告。注意,这只是一个函数定义,它从不在任何地方调用。注意,虽然player_1_符号在get_符号中是全局的,但在player_输入中是局部的,在validate_符号中是非局部的。在任何情况下,您都不应该依赖全局可变状态,因此,当我运行脚本时,变量player_1_symbol首先被指定为X,但当它到达运行validate_symbol函数的点时,它会将值指定为None。我希望它根据用户输入将值保持为X或O。旁注:在player_输入函数中定义player_1_符号和player_2_符号实际上没有用,因为您在运行时在get_符号中再次定义它们。第二条评论很好地解释了为什么不应该依赖于单个全局变量太多范围限制/堆栈中未使用的内存。作为程序员,你应该非常非常努力地避免使用全局变量。因此,你的解决方案是可行的,但是为什么只有变量而不是列表不起作用呢?只有变量不起作用,因为当您在函数中创建player_1_符号时,python会将其识别为新变量,而不是全局变量。正如其他评论者所说,在代码中使用全局x不是最佳实践,因此我列出了一个包含变量的列表。