Python 模块重用同一个对象

Python module reusing the same object

这个模块returns一个列表。当我用 ipscan.scan('192.168.11', 161) 调用模块时,列表会被附加而不是返回一个新列表。我设法 "reset" 列表的唯一方法是像这样 ipscan.scan.func_globals['node_list'] = []

重新分配全局参数键 "node_list"

作为初学者,我不知道如何更好地描述问题。 谢谢!

import socket
from threading import Thread

socket.setdefaulttimeout(1)

node_list = []


def probe(ip, port):
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

    try:
        s.connect((ip, port))
        node_list.append(ip)
    except:
        pass

    s.close()


def scan(ipnet, port):
    for x in range(1,255):
        ip = '{0}.{1}'.format(ipnet, x)

        t = Thread(target=probe, args=(ip, port))
        t.start()

    return node_list

node_list的正确初始化:

import socket
from threading import Thread

socket.setdefaulttimeout(1)


def probe(ip, port):
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

    try:
        s.connect((ip, port))
        node_list.append(ip)
    except:
        pass

    s.close()


def scan(ipnet, port):
    global node_list
    node_list = []

    for x in range(1,255):
        ip = '{0}.{1}'.format(ipnet, x)

        t = Thread(target=probe, args=(ip, port))
        t.start()

    return node_list

这很简单,不要在函数外声明你的列表。

node_list = [] 移动到您的函数定义中:

def scan(ipnet, port):
    node_list = []
    for x in range(1,255):
        ip = '{0}.{1}'.format(ipnet, x)

        t = Thread(target=probe, args=(ip, port))
        t.start()

    return node_list

本质上,您想多读一点有关名称空间的内容。