Моя глобальная переменная не меняется (Python)

#python #multithreading #sockets #server #global-variables

Вопрос:

Я создаю онлайн-игру в угадывание флага с помощью сокетов. Код сервера ниже (извините за вставку всего кода, я тестировал и буквально понятия не имею, в чем может быть проблема):

 import socket import threading import random from time import sleep from func import get_flags   flags = get_flags() flag_names = [i for i in flags] current_flag = " " show_answer = False  errorCounter = 0  HEADER = 64 PORT = 5050 SERVER = socket.gethostbyname(socket.gethostname()) ADDR = (SERVER, PORT) FORMAT = 'utf-8'  server = socket.socket(socket.AF_INET, socket.SOCK_STREAM) server.bind(ADDR)  players = [] num_of_players = int(input("Number of players: "))  def handle_client(conn, addr):  global show_answer, current_flag   print(f"[NEW CONNECTION] {addr} connected.")   connected = True  player = ()  while connected:  print(current_flag)   msg_length = conn.recv(HEADER).decode(FORMAT)  if msg_length:  msg_length = int(msg_length)  msg = conn.recv(msg_length).decode(FORMAT)  #print(f"[{addr}] {msg}")   msg = msg.lower()  msg = msg.split(" ")  try:  if msg[0] == "!set_username" and len(msg) gt; 1:  player = (msg[1], addr)  players.append(player)   elif msg[0] == "!get_flags":  conn.send(str(flags).encode(FORMAT))   elif msg[0] == "!ready":  conn.send(str(len(players) gt;= num_of_players).encode(FORMAT))   elif msg[0] == "!get_current_flag":  conn.send(current_flag.encode(FORMAT))   elif msg[0] == "!show_answer":  conn.send(str(show_answer).encode(FORMAT))    except Exception:  print("asd")   #conn.send("Msg received".encode(FORMAT))  players.remove(player)  conn.close()   def start():  global show_answer, current_flag   server.listen()  print(f"[LISTENING] Server is listening on {SERVER}:{PORT}")  while len(players) lt; num_of_players:  conn, addr = server.accept()  thread = threading.Thread(target=handle_client, args=(conn, addr))  thread.start()   print("nThe game has started.n")  while True:  sleep(3)  show_answer = False  current_flag = random.choice(flag_names)  sleep(10)  show_answer = True   if __name__ == "__main__":  print("[STARTING] server is starting...")  start()   

Моя проблема в том, что: Когда я вызываю функцию start() и лобби заполняется, начинаются «игровые часы», которые определяют, сколько времени у игроков есть, чтобы угадать флаг, и время, в течение которого они могут увидеть правильный ответ. Когда я изменяю эти переменные (show_answer и current_flag), они меняются, но не в in handle_client(). Это почему?

Клиент может нормально подключаться, но не может видеть обновленные переменные. Я использую Python 3.9.5, если это поможет.

Комментарии:

1. В handle_client : Есть опечатка show_awnser

2. да, я понял, что awnser не был правильным способом написания ответа при публикации этого, поэтому я быстро изменил имена переменных и оставил это, поэтому опечатка была создана во время публикации lol

3. global переменные обычно не рекомендуется использовать, так как они могут вызвать множество проблем. Возможно, вам захочется рассмотреть другой подход, например, класс с переменными экземпляра, для вашего кода.