Python UnboundLocalError:局部变量';客户';分配前参考
我用python编写了这段代码,但当我调用函数时,它会给我这个错误。哪里出了问题 我也有这个功能,它不会导致任何问题。(它使用clients变量)。请忽略我代码中的注释Python UnboundLocalError:局部变量';客户';分配前参考,python,Python,我用python编写了这段代码,但当我调用函数时,它会给我这个错误。哪里出了问题 我也有这个功能,它不会导致任何问题。(它使用clients变量)。请忽略我代码中的注释 clients = [] def disconnect_client (): for c in clients: c['conn'].close() clients = [] 客户端未在断开\u客户端中定义。它是在功能范围之外定义的。在disconnect_cli
clients = []
def disconnect_client ():
for c in clients:
c['conn'].close()
clients = []
客户端
未在断开\u客户端
中定义。它是在功能范围之外定义的。在disconnect_client中定义它或将其作为参数传递。您正在尝试重新绑定客户端
,这意味着Python认为它是一个局部变量,因此无法看到同名的全局变量
您可以通过如下方式清除函数中的客户端来解决此问题:
def start_server ():
# pornim serverul de socket. parametrii default: AF_INET, SOCK_STREAM, 0
s = socket.socket()
# legam portul 8001 de serverul de socket
s.bind(('', 8001))
# definim numarul maxim de conexiuni in asteptare
s.listen(5)
threading.Thread(target = server_commands).start()
# facem serverul sa ruleze continuu
while 1:
# asteptam o conexiune la server
# se vor returna 2 valori, un obiect de tip socket (clientul) care se va pune in variabila conn, si adresa clientului care va fi pusa in variabila addr
conn, addr = s.accept()
print 'Connection from:', addr
# punem obiectul intr-un array pentru a tine evidenta
clients.append({'conn': conn, 'addr': addr})
# pornim un nou thread pentru fiecare client pentru a putea accepta o noua conexiune
# ii dam ca parametrii functia cu care va rula si parametrii dati functiei, in acest caz ii pasam obiectul client si adresa sa
threading.Thread(target = handle, args = (conn, addr)).start()
更改现有列表,而不是重新绑定它。如果您确实希望运行此命令并重新绑定客户端变量,可以使用全局关键字:
clients[:] = []
但正如@brito所建议的那样,只需将其交给对方,然后将其退回,实际上会更加明智:
clients = []
def disconnect_client ():
for c in clients:
c['conn'].close()
global clients
clients = []
我也不知道为什么第一次缩进要用八个空格
有趣的是,这是一个有点不可靠的错误。我以前从未见过它,但我希望它会抛出一个错误,明确通知您正在尝试重新绑定一个全局变量,这就是问题所在——因为如果局部范围中不存在具有给定名称的变量,函数通常可以找到一个全局变量;只有当您尝试重新绑定它时,它才会导致问题
clients
是diconnect\u client
函数的一个局部变量,在该函数中,您没有引用定义为其外部列表的clients
。在disconnect\u client
中添加global client
以便python知道您不希望局部变量隐藏全局。是clients
仅在您发布的第一个代码块上定义?我正在使用tab键
clients = []
def disconnect_client (clients):
for c in clients:
c['conn'].close()
clients = []
return clients