Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/347.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 类型错误:';int';对象不可下标_Python_Python 3.x - Fatal编程技术网

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,谢谢你的评论。我相应地更新了答案。