2014-02-28 40 views
0

为什么此代码段会导致:TypeError 'int' object is not subscriptableTypeError:'int'对象不可自订

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

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

+2

你正在申请[]为int(hexdata),它是整数 – Anycorn

+0

所以你是在暗示斌(INT(hexdata [2:]))zfill(16))。? – cjwert

+0

如果这是你的意图,那么是的。斌返回一个字符串,我假设你想填充?然而,如果我理解正确,hexdata是十六进制字符串?在这种情况下,你需要指定正确的基数,例如'int(“0xA”,16)' – Anycorn

回答

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 

如果一部开拓创新的字符串是十六进制表示,你应该通过可选base自变量16

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

如果使用[2:]删除由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' 

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

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

UPDATE

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

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

2-subscript显然是为了摆脱样本编号为”0x0101“的”0x“。我认为关于'1234'[2:]'的所有内容可能是多余的。 – paxdiablo

+0

@paxdiablo,我不这么认为。尝试'int('0x12')':引发'ValueError:int()的基数为10:'0x12'的无效文字,这与OP提到的问题不同。 – falsetru

+0

@paxdiablo,恕我直言,'[2:]'被用来删除由'bin'前缀的'0b'。 – falsetru

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' 
+1

应该将基数设置为16:'int(hexdata,16)' – zhangxaochen

+0

它是十六进制的:“hexdata是一个十六进制字符串。 ,它可能是0x0101“ – user2357112