【问题标题】:Why are hexadecimal numbers automatically converted to decimal?为什么十六进制数字会自动转换为十进制?
【发布时间】:2016-11-12 08:29:34
【问题描述】:

我正在研究一种 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

标签: python dictionary hex decimal


【解决方案1】:

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

它们最初不是以十六进制存储的。 Python 不跟踪任何关于 base 的信息;无论您在源代码中输入0x1000 还是4096,都是相同的数字,Python 的存储方式也相同。

当 Python 打印一个数字时,它必须选择一个基数来显示它,默认值始终是十进制。如果要以不同的方式打印,则需要指定不同的方式来执行字符串转换,例如hex 函数:

>>> print 0x1000
4096
>>> print hex(0x1000)
0x1000

【讨论】:

  • 如果您总是想确保显示前导零,请使用format string syntax:print ("{:04x}".format(1))
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-09-04
    • 2015-01-26
    • 1970-01-01
    • 1970-01-01
    • 2011-07-28
    • 2014-12-31
    • 1970-01-01
    相关资源
    最近更新 更多