Python 类型错误:';int';对象不可下标
为什么此代码段会导致:Python 类型错误:';int';对象不可下标,python,python-3.x,Python,Python 3.x,为什么此代码段会导致:TypeError'int'对象不可下标 return (bin(int(hexdata)[2:].zfill(16))) hexdata是一个十六进制字符串。例如,它可能是位于错误位置的括号。假设您有一个类似“0x0101”的字符串,其中希望以16位二进制字符串结束: bin(int(hexdata,16))[2:].zfill(16) int(X,16)调用将其解释为十六进制数(并且可以接受形式为0xSomething)的数字)。然后bin(X)将其转换为0b010
TypeError'int'对象不可下标
return (bin(int(hexdata)[2:].zfill(16)))
hexdata
是一个十六进制字符串。例如,它可能是位于错误位置的括号。假设您有一个类似“0x0101”的字符串,其中希望以16位二进制字符串结束:
bin(int(hexdata,16))[2:].zfill(16)
int(X,16)
调用将其解释为十六进制数(并且可以接受形式为0xSomething
)的数字)。然后bin(X)
将其转换为0b01010101
格式的字符串
[2::
然后去掉前面的0b
,然后zfill(16)
将其填充到16位
括号放错地方了。假设您有一个类似“0x0101”的字符串,其中希望以16位二进制字符串结束:
bin(int(hexdata,16))[2:].zfill(16)
int(X,16)
调用将其解释为十六进制数(并且可以接受形式为0xSomething
)的数字)。然后bin(X)
将其转换为0b01010101
格式的字符串
[2::
然后去掉前面的0b
,然后zfill(16)
将其填充到16位
您正在这样做:
>>> 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__'
如果原始字符串是十六进制表示,则应传递可选的base
参数16
>>> int('1234'[2:], 16)
52
如果使用[2://code>删除由bin
生成的0b
(而不是从原始字符串中删除前导字符),则以下是您想要的
>>> 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'
顺便说一句,您可以使用或代替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
您正在这样做:
>>> 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__'
如果原始字符串是十六进制表示,则应传递可选的base
参数16
>>> int('1234'[2:], 16)
52
如果使用[2://code>删除由bin
生成的0b
(而不是从原始字符串中删除前导字符),则以下是您想要的
>>> 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'
顺便说一句,您可以使用或代替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
您正在将[]应用于int(hexdata),这是一个整数,因此您建议使用bin(int(hexdata[2:]).zfill(16))?如果这是您的意图,那么是的。bin返回一个字符串,我认为您要填充它?但是,如果我理解正确,hexdata是一个十六进制字符串?在这种情况下,您需要指定正确的基数,例如int(“0xA”,16)
您正在将[]应用于int(hexdata),这是一个整数,因此您建议使用bin(int(hexdata[2:])。zfill(16))?如果这是您的意图,那么选择是。bin返回一个字符串,我认为您要填充它?但是,如果我理解正确,hexdata是一个十六进制字符串?在这种情况下,您需要指定正确的基数,例如int(“0xA”,16)
应将基数设置为16:int(hexdata,16)
它是十六进制:“hexdata是十六进制字符串。例如,它可能是0x0101”。应将基数设置为16:int(hexdata,16)
它是十六进制:“hexdata是十六进制字符串。例如,它可能是0x0101”2下标显然是为了从样本号0x0101
中去掉0x
。我认为所有关于“1234”[2://code>的东西可能都是多余的。@paxdiablo,我不这么认为。尝试int('0x12')
:引发ValueError:int()的无效文本,以10为基数:“0x12”
,这与OP在问题中提到的不同。@paxdiablo,IMHO,[2://code>用于删除bin
前面的0b
。实际上,你是对的,int(x,16)
愉快地接受格式为0xWhatever
的数字。但我仍然认为答案中不需要建议int('1234'[2:])
,因为它们没有触及0bxxxx
字符串。@paxdiablo,谢谢你的评论。我相应地更新了答案。2下标显然是为了从样本编号0x0101
中去掉0x
。我认为所有关于“1234”[2://code>的东西可能都是多余的。@paxdiablo,我不这么认为。尝试int('0x12')
:引发ValueError:int()的无效文本,以10为基数:“0x12”
,这与OP在问题中提到的不同。@paxdiablo,IMHO,[2://code>用于删除bin
前面的0b
。实际上,你是对的,int(x,16)
愉快地接受格式为0xWhatever
的数字。但我仍然认为答案中不需要建议int('1234'[2:])
,因为它们没有触及0bxxxx
字符串。@paxdiablo,谢谢你的评论。我相应地更新了答案。