len 和 sizeof 的区别

Posted

技术标签:

【中文标题】len 和 sizeof 的区别【英文标题】:difference between len and sizeof 【发布时间】:2021-07-23 01:26:44 【问题描述】:

我正在使用 python 3.6 - 我正在尝试使用 struct 库来打包要使用 UDP 发送到自定义协议的小端数据包。

如果我们执行len(struct.pack('<hhislddiii',1,2,3,b'C',1,2,3,4,5,6)),那么我们会得到 41,这是正确的字节长度。但是,如果我们做struct.pack('<hhislddiii',1,2,3,b'C',1,2,3,4,5,6).__sizeof__(),我们会得到 58。有人可以解释一下这两者有什么区别吗?我正在尝试使用 scapy 作为 UDP 数据包来制作数据包,因此获得正确的数据包格式至关重要。想了解其中的区别。

【问题讨论】:

sizeof 是 Python 内部数据结构的大小。它包括诸如对象类型和引用计数等信息。它与您正在设置的数据中的字节数只有有限的关系,并且通常会更大;有时更小,例如,一个列表,它存储对列表元素的引用,而不是数据。 sizeof 主要在您拥有庞大的数据结构并且内存不足时很有用。 谢谢!是的,我现在明白了。 【参考方案1】:

len 是集合中的项目数。 __sizeof__ 是该对象的大小(以字节为单位)。另外,你通常不会单独调用__sizeof__,Pythonic 的做法是调用sys.getsizeof(object_name)

source

【讨论】:

在这种情况下,没有 41 个元素,所以不确定我是否理解您的答案。有意为 41 个字节。注意到 pythonic 的东西 - 但你可能知道额外的 17 个字节用于什么? 很公平,我无法解释这个确切的情况。

以上是关于len 和 sizeof 的区别的主要内容,如果未能解决你的问题,请参考以下文章

C++sizeof的各种玩法

#define LEN sizeof(struct shu) 是啥意思

sizeof(T) 和 Unsafe.SizeOf<T>() 有啥区别?

sizeof 和 strlen 的区别

使用 Malloc,sizeof(int) * numRows 和 sizeof(int * [numRows]) 之间的区别

说明sizeof和strlen之间的区别。