为什么Python数组模块对字符串和列表的处理不同?
我对以下语句的结果有点困惑:
>>> from array import array
>>> array('L',[0xff,0xff,0xff,0xff])
array('L', [255L, 255L, 255L, 255L])
>>> from array import array
>>> array('L','\xff\xff\xff\xff')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: string length not a multiple of item size
2 个回答
1
在第一个例子中,你是从一个包含4个元素的列表来初始化数组的。这会给你一个有4个元素的数组,每个元素对应列表中的一个值。
在第二个例子中,你是从一个字节字符串来初始化数组的:字符串中的字节会直接复制到数组里。'L'这个标识符会创建一个无符号长整型数组,这种类型的每个元素至少占用4个字节。
在我的电脑上(Windows 64位,Python 2.6),从一个4字节的字符串初始化数组是没问题的:
>>> a = array('L','\xff\xff\xff\xff')
>>> a.tostring()
'\xff\xff\xff\xff'
我猜你用的Python版本里的无符号长整型是8个字节,而不是4个。你可以试着把你从列表创建的数组转换回字符串,看看它包含多少字节:
>>> a = array('L',[0xff,0xff,0xff,0xff])
>>> a.tostring()
'\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00'
附注:我假设你在使用Python 2.x,如果是Python 3.x,你会遇到一个类型错误。
3
你正在使用64位版本的Python,在这个版本中,array
把类型代码'L'
当作64位的无符号整数来处理。
>>> array('L','\xff\xff\xff\xff\xff\xff\xff\xff')
array('L', [18446744073709551615L])
文档说明得不是很清楚。它只提到'L'
至少占用四个字节。