#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'