Почему я не меняю глобальный охват так, как я думал

#python #tic-tac-toe #global-scope

Вопрос:

Я предполагаю, что моя проблема связана с глобальным масштабом. Я не уверен, что именно я не понимаю. У меня есть computer_symbol, определенный в глобальной области в строке 6. Тогда функция choose_symbol в строке 18 должна делать computer_symbol тем, что пользователь не выбирает. Затем я вызываю функцию в строке 30. Но когда я пытаюсь использовать переменную в строке 45 и протестировать свой код, я вижу, что computer_symbol по-прежнему равен значению «ничего», которое когда-либо использовалось только в качестве заполнителя.

 import random   board_locations = [0, 1, 2, 3, 4, 5, 6, 7, 8]  computer_symbol = 'nothing'  def draw_board():  print(' | | ')  print(f'_{board_locations[0]}_|_{board_locations[1]}_|_{board_locations[2]}_')  print(' | | ')  print(f'_{board_locations[3]}_|_{board_locations[4]}_|_{board_locations[5]}_')  print(' | | ')  print(f' {board_locations[6]} | {board_locations[7]} | {board_locations[8]} ')  print(' | | ')   def choose_symbol(user_symbol):  if user_symbol == 'X':  computer_symbol = 'O'  else:  computer_symbol = 'X'   return computer_symbol   draw_board()  user_symbol = input("Would you like to be 'X' or 'O': ") choose_symbol(user_symbol)  game = True  while game:  draw_board()   chosen_location = int(input('Choose the location you want to move on the board: '))  if chosen_location in board_locations:  board_locations.pop(chosen_location)  board_locations.insert(chosen_location, user_symbol)  draw_board()  computer_choice = random.choice(board_locations)   board_locations.pop(computer_choice)  board_locations.insert(computer_choice, computer_symbol)  

Сначала у меня даже не было переменной computer_symbol, потому что я думал, что смогу сделать это в функции choose_symbol (), но программе это не понравилось, потому что computer_symbol не был определен.

Ответ №1:

computer_symbol Переменная, которую вы используете внутри функции, является локальной переменной внутри функции, поэтому она не совпадает с глобальной computer_symbol переменной. Чтобы изменить это, вы можете явно ссылаться на глобальную переменную внутри функции, добавив оператор global computer_symbol в верхней части тела функции.

Однако, судя по показанному вами коду, нет необходимости в том, чтобы ваша функция меняла глобальную переменную здесь. В общем, лучше избегать таких побочных эффектов, если вы можете. Просто удалите computer_symbol = 'nothing' назначение и вместо этого назначьте возвращаемое значение функции:

 computer_symbol = choose_symbol(user_symbol)  

Ответ №2:

Определение computer_symbol действительно является глобальным, но вы не можете изменять глобальные переменные внутри функции. Для того, чтобы это сделать , вам нужно добавить global var_name , чтобы это выглядело так:

 def choose_symbol(user_symbol):  global computer_symbol  if user_symbol == 'X':  computer_symbol = 'O'  else:  computer_symbol = 'X'