Python2与Python3字典生成差异问题及兼容方案咨询
问题原因与兼容解决方案
差异原因
Python 2 和 Python 3 对 / 运算符的行为有本质区别:
- 在 Python 3 中,
/始终执行浮点除法,哪怕两个操作数都是整数,比如1/8会得到0.125。 - 在 Python 2 中,当
/的两个操作数都是整数时,执行整数截断除法,结果只保留整数部分,所以1/8的结果是0。
这就导致你的代码里,1-1/8*x 在 Python 2 中实际计算为 1 - 0*x = 1,最终所有 x>0 的字典值都是 1,和预期不符。
你尝试的写法无效的原因
你试的几种写法都没解决核心问题:1/8 在 Python 2 里已经先算出了 0,后续转 float 或者把 x 转 float 都改变不了这个结果:
float(1-1/8*x):先算1/8=0,再乘 x 得 0,1-0=1,转 float 后还是1.01-float(1/8*x):1/8*x结果是 0,转 float 后是0.0,1-0.0=1.01-1/8*float(x):1/8=0,乘float(x)还是0.0,1-0.0=1.0
兼容 Python 2 和 3 的写法
有两种可靠的解决方式:
方式1:将除法操作数改为浮点数
把 1/8 改成 1.0/8 或者 1/8.0,强制触发浮点除法:
x = {2**x-1: 1 - 1.0/8*x if x>0 else -1 for x in range(0,9)}
方式2:导入 Python 3 除法规则
在脚本开头添加 from __future__ import division,让 Python 2 采用 Python 3 的除法逻辑:
from __future__ import division x = {2**x-1: 1 - 1/8*x if x>0 else -1 for x in range(0,9)}
以上两种写法都能在 Python 2 和 3 中生成你预期的字典结果。
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

