代码之家  ›  专栏  ›  技术社区  ›  cmcginty

为什么python数组模块处理字符串和列表的方式不同?

  •  1
  • cmcginty  · 技术社区  · 14 年前

    我很难理解以下陈述的结果:

    >>> 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 回复  |  直到 14 年前
        1
  •  3
  •   Marcelo Cantos    14 年前

    您在64位的python版本上运行它,在这个版本上 array TREATS类型代码 'L' 作为64位无符号整数。

    >>> array('L','\xff\xff\xff\xff\xff\xff\xff\xff')
    array('L', [18446744073709551615L])
    

    文件不是很清楚。它所说的就是 “L” 至少是四个字节。

        2
  •  1
  •   Duncan    14 年前

    在第一种情况下,您从包含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上,您将得到一个类型错误。