Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/343.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python UnboundLocalError:局部变量';客户';分配前参考_Python - Fatal编程技术网

Python UnboundLocalError:局部变量';客户';分配前参考

Python UnboundLocalError:局部变量';客户';分配前参考,python,Python,我用python编写了这段代码,但当我调用函数时,它会给我这个错误。哪里出了问题 我也有这个功能,它不会导致任何问题。(它使用clients变量)。请忽略我代码中的注释 clients = [] def disconnect_client (): for c in clients: c['conn'].close() clients = [] 客户端未在断开\u客户端中定义。它是在功能范围之外定义的。在disconnect_cli

我用python编写了这段代码,但当我调用函数时,它会给我这个错误。哪里出了问题

我也有这个功能,它不会导致任何问题。(它使用clients变量)。请忽略我代码中的注释

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