Python 第一个函数的第二个返回值打印两次

Python 第一个函数的第二个返回值打印两次,python,function,return,Python,Function,Return,我试图简单地打印出附加到各自列表中的值(端口)。我用tcp和udp将其分开。我要传递给>的字典的类型是否如下{'22':'TCP','53':'UDP','31337':'TCP','80':'TCP','515':'UDP'} 这是我的密码 x = _expected_ports_type_to_dict(ET.parse('scanme.nmap.org.xml')) TCP_LIST = [] UDP_LIST = [] def _does_port_dict_have_type(

我试图简单地打印出附加到各自列表中的值(端口)。我用tcp和udp将其分开。我要传递给
>的字典的类型是否如下
{'22':'TCP','53':'UDP','31337':'TCP','80':'TCP','515':'UDP'}

这是我的密码

x = _expected_ports_type_to_dict(ET.parse('scanme.nmap.org.xml'))


TCP_LIST = []
UDP_LIST = []


def _does_port_dict_have_type(port_dict):
    for port, typee in port_dict.iteritems():
         if (typee is not None) and len(typee) > 0:
             if typee == "TCP":
                 TCP_LIST.append(port)
             else:
                 UDP_LIST.append(port)
        else:
            pass
    return ','.join(UDP_LIST), ','.join(TCP_LIST)


UDP = _does_port_dict_have_type(x)[0]
TCP = _does_port_dict_have_type(x)[1]


def print_value(func):
    print func


print_value(UDP)
print_value(TCP)
这是我的输出
8031337,22515,53515,53


TCP变量或_does_port_dict_have_type()的[1]位置是始终显示两次的值。不管我是通过UDP\U列表还是TCP\U列表。有人知道为什么会发生这种情况吗

实际上,您在这里调用了两次函数:

UDP = _does_port_dict_have_type(x)[0]
TCP = _does_port_dict_have_type(x)[1]
由于函数返回一个元组,因此无需调用它两次。您可以使用元组解包并在单个语句中分配两个返回值,如:

UDP, TCP = _does_port_dict_have_type(x)
通过理解,您的功能可以大大简化:

def _does_port_dict_have_type(port_dict):
    tcp = [k for k,v in port_dict.items() if v == "TCP"]
    udp = [k for k,v in port_dict.items() if v == "UDP"]
    return ','.join(udp), ','.join(tcp)
在Python2中,看起来您使用的是
iteritems
而不是
items

def _does_port_dict_have_type(port_dict):
    tcp = [k for k,v in port_dict.iteritems() if v == "TCP"]
    udp = [k for k,v in port_dict.iteritems() if v == "UDP"]
    return ','.join(udp), ','.join(tcp)

啊。由于在我第二次调用print_值时函数运行了两次,所以数组被追加了两次。正确吗?是的,这就是问题:)是的,因为您在函数外部创建TCP_列表和UDP_列表,因此它们的内容在函数调用之间被保留。这就是为什么您不应该使用全局变量,而应该在任何时候编程纯函数的原因possible@UCProgrammer你自己在那里抓到的很好!;)