TypeError:'int'对象不可订阅

时间:2014-02-28 07:34:49

标签: python python-3.x

为什么此代码段会导致:TypeError 'int' object is not subscriptable

return (bin(int(hexdata)[2:].zfill(16)))

hexdata是十六进制字符串。例如,它可能是0x0101

2 个答案:

答案 0 :(得分:4)

你这样做:

>>> int('1234')[2:]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'int' object has no attribute '__getitem__'

>>> 1234[2:]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'int' object has no attribute '__getitem__'

如果您打算删除前两个字符,请使用以下命令:

>>> int('1234'[2:])
34

如果orignal字符串是十六进制表示,则应传递可选的base参数16

>>> int('1234'[2:], 16)
52

如果[2:]用于删除0b生成的bin(不删除原始字符串中的前导字符),则可以使用以下内容。

>>> int('0x1234', 16) # No need to remove leading `0x`
4660
>>> int('0x1234', 0)  # automatically recognize the number's base using the prefix
4660
>>> int('1234', 16)
4660
>>> bin(int('1234', 16))
'0b1001000110100'
>>> bin(int('1234', 16))[2:]
'1001000110100'
>>> bin(int('1234', 16))[2:].zfill(16)
'0001001000110100'

顺便说一句,您可以使用str.formatformat代替bin + str.zfill

>>> '{:016b}'.format(int('1234', 16))
'0001001000110100'
>>> format(int('1234', 16), '016b')
'0001001000110100'

<强>更新

如果您指定0作为基础,int将使用前缀自动识别该数字的基数。

>>> int('0x10', 0)
16
>>> int('10', 0)
10
>>> int('010', 0)
8
>>> int('0b10', 0)
2

答案 1 :(得分:1)

括号在错误的地方。假设您有一个像“0x0101”这样的字符串,您希望最终得到一个16位二进制字符串:

bin(int(hexdata,16))[2:].zfill(16)

int(X,16)调用将其解释为十六进制数字(并且可以接受多个形式0xSomething)。然后bin(X)将其转换为0b01010101形式的字符串。

[2:]然后摆脱前面的0bzfill(16)填充16“位。

>>> bin(int("0x0102",16))[2:].zfill(16)
'0000000100000010'