Python 3.x 为什么输出是;p未定义“;?

Python 3.x 为什么输出是;p未定义“;?,python-3.x,Python 3.x,我得到: import socket # Import socket module s = socket.socket(socket.AF_INET,socket.SOCK_STREAM) # Create a socket object host = socket.gethostbyname("www.itsecgames.com") global port for port in range(0,1): try :

我得到:

import socket              # Import socket module

s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)         # Create a 
socket object

host = socket.gethostbyname("www.itsecgames.com")

global port

for port in range(0,1):
    try :
        connect = s.connect((host,port))
        print("Port [",port,"] : Connection accepted.")
        global p 
        p = port
    except :
        print("Port [",port,"] : Connection refused.")
w = p

print(w)

这个问题只能重现

这是因为,在这种情况下,您从未设置
p
。由于您从未设置过
p
,并且在您这样做之前它不存在于全局范围中,
w=p
是无效的

考虑给它一些初始值,或者跳过整个
w
过程,除非建立了连接


具体来说,在这种情况下,
connect
调用抛出的原因是您试图连接到端口0上的网站。HTTP网页通常可以在端口80上访问。

全局变量在这里是不相关的,通常在Python中应该避免。在简化的示例中,我们可以清楚地看到,除了零件p未定义外:

w = p
NameError: name 'p' is not defined
治疗方法很简单:

global port

for port in range(0, 1):
    try:
        #global p
        0 / 0
        p = port
    except:
        print("Port [",port,"] : Connection refused.")
w = p

print(w)
在循环之前


更多说明:范围(0,1)只产生一个值。

p=端口从未有机会运行过?我怀疑是否需要套接字来重现这一点。构建a。如果将
全局端口
子句修复为
全局端口,p
,会发生什么?这不是完整的输出。在删除0/0后,请尝试我的答案中的示例-您将看到模块级别的代码将起作用。所以这里的外部范围论点不成立。为什么?这是(a)除被击中之外的的原因,以及(b)导致投诉错误的原因。你还想要什么?
p = None