Python模块重用相同的对象

时间:2015-02-16 16:55:40

标签: python global

此模块返回一个列表。当我使用ipscan.scan('192.168.11', 161)调用模块时,会附加列表而不是返回新列表。我成功的唯一方法是重置"该列表是通过重新分配全局参数键" node_list"像这样ipscan.scan.func_globals['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

1 个答案:

答案 0 :(得分:0)

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

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

基本上,您想要更多地了解命名空间。