我目前正在python中创建一个聊天应用程序。 它的工作原理如下: 1.服务器正在运行 2.客户输入他们的ID和密码 3.服务器检查登录信息 4.服务器为它们分配一个随机数 5.他们现在可以从服务器发送和回复消息
我在收到身份证和通行证方面遇到了问题(请不要责怪我使用全球和执行官)
def recv_server():
global number
global s #the tcp socket
exec("global sock"+number) #creating a specific sock for each connection
exec("sock"+number+","+"sockname"+number+" = s.accept()")
exec("logindata=sock"+number+".recv(65535)")
logindata=logindata.decode()
...
代码为1的数字为:
global sock1
sock1, sockname1 = s.accept()
logindata=sock1.recv(65535)
我在Windows上使用python 3.2并且在运行脚本时,当登录数据通常具有值时,现在它是未分配的
File 'abc' line 23, in recv_server
logindata=logindata.decode()
UnboundLocalError: local variable 'logindata' referenced before assigment
在我的Linux电脑上(薄荷11),用dropbox共享文件并用python(2.7)打开不会给我任何错误
现在我问是否有人知道这个问题的原因是什么?
答案 0 :(得分:2)
哎哟哎哟。
关于global
的内容,我让你纠正,但
def recv_server():
global number
global s #the tcp socket
global sockets
sockets[number], sockname = s.accept()
logindata = sockets[number].recv(65535)
logindata = logindata.decode()
...
定义了sockets
可能sockets = {}
左右至少会尝试合理编码。
然后exec
消失,只有global
停留,这是恕我直言不好,但不像另一个那么难看。
您的错误源于编译器因为logindata
内容而无法识别exec
的第一次分配。
答案 1 :(得分:1)
根本不要使用exec。
def recv_server():
globals()["sock"+number], locals()["sockname"+number] = s.accept()
logindata = locals()["sock"+number].recv(65535)
logindata=logindata.decode()
我认为全球人和当地人在工作中存在很大的误解
这里。首先,如果未分配number
和s
本地(函数)范围,那么就没有必要将它们声明为
global
因为它们只会被阅读。其次,为什么doess sockname#
需要在本地范围内使用sockname#。它可能只是sockname
也许你是来自一种与Python不同的语言?如果是这样的话,如果你花时间熟悉Python中本地和全局范围之间的区别,那么你的生活会更容易。