为什么十六进制数会自动转换为十进制数?

4

我正在编写一个小的Python方法,需要从另一个文件中读取表示键和值的字典。

但是我在传输数字值时遇到了问题。例如,我的字典中的某些键看起来像这样:

id_dict = {
    'val_a': 0x0000,
    'val_b': 0x1000
}

但我注意到当我尝试遍历字典时,十六进制被替换为十进制值。即使在原始的id_dict.py中,字典中的数字也会自动转换为十进制。

这是我尝试遍历它的结果:

for k,v in id_dict.items():
    print(k,v)

#Results
val_a 0
val_b 4096

有人能告诉我为什么这些值以十进制形式表示,而不是它们最初存储的十六进制形式吗?

如果有一种方法可以停止自动转换,那么理解起来会很好!


如果从答案中不清楚,这个问题的字典方面与问题无关。最小化的复制是在解释器中键入>>> 0x22,它会给出34 - ggorlen
2个回答

8
有人能告诉我为什么这些值以十进制形式表示,而不是它们最初存储的十六进制形式吗?
它们最初并不是以十六进制形式存储的。Python 不跟踪任何有关基数的信息;无论您在源代码中键入 0x1000 还是 4096,它都是相同的数字,Python 以相同的方式存储它。
当 Python 打印一个数时,它必须选择一种基数来显示它,而默认值始终为十进制。如果您想以其他方式打印它,您将需要指定不同的字符串转换方法,例如 hex 函数:
>>> print 0x1000
4096
>>> print hex(0x1000)
0x1000

1
如果您希望始终确保显示前导零,请使用格式化字符串语法print ("{:04x}".format(1)) - Tim Pietzcker

3

Python存储数字的方式是相同的,唯一的不同之处是格式。你的问题在于数字的格式化,而不是表示方式,因此,你可以通过字符串格式化来解决问题:

>>> d = {k:v for k,v in zip('abcdefg',range(1,5000,313))}
>>> d
{'e': 1253, 'g': 1879, 'a': 1, 'd': 940, 'c': 627, 'b': 314, 'f': 1566}
>>> for k,v in d.items():
...   print("{} {:#06x}".format(k,v))
... 
e 0x04e5
g 0x0757
a 0x0001
d 0x03ac
c 0x0273
b 0x013a
f 0x061e

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接