python中缺乏一致性,函数之前已定义变量的行为完全矛盾

Jęd*_*ruj -1 python function definition

我迷失了方向,因为我的代码正在执行完全矛盾的动作。我packet_counts在定义函数之前定义为Counter(),custom_action没有问题。当我尝试将test1int 定义为int时,就像packet_countstest1内部custom_action未定义一样。缺乏一致性。你们能告诉我什么地方错了吗?

我尝试global了相同的结果。我无法定义test1内部函数,因为它必须使用scapy收集捕获的数据包的大小,如果这样做,它将在每次调用时重置。

from collections import Counter

test1=0
packet_counts = Counter()
def custom_action(packet):
    key = tuple(sorted([packet[0][1].src, packet[0][1].dst]))
    packet_counts.update([key])
    packetSize = len(packet)
    test1 += packetSize              #here occurs error that test1 is undefined...
Run Code Online (Sandbox Code Playgroud)

Sha*_*ger 7

在函数中分配的任何名称都是隐式本地的。如果仅从名称读取,它将从包含该变量的最近范围读取。

test1 += packetSize  
Run Code Online (Sandbox Code Playgroud)

既是读取又是赋值,都是test1局部的,但是由于没有事先赋值,所以得到了UnboundLocalError(因为您实际上只是想说test1 = ??? + packetSize)。

要在不使其局部化的情况下写入变量,请添加:

global test1
Run Code Online (Sandbox Code Playgroud)

要么

nonlocal test1
Run Code Online (Sandbox Code Playgroud)

作为函数的第一行。前者显式跳转到全局范围后者在最接近的范围内查找它(在这种情况下,它们是等效的)。

请注意,global通常,要求声明的代码通常是错误的形式。通常,您应该使用一个类的实例,而该函数是该类的一个方法(每个实例可以保留其自己的状态,而不是只有一个全局状态),这通常是一个线索。