Python 2.7与3.x除法规则变化致网格对齐代码失效问题
Python 2 vs 3 除法行为差异导致网格对齐失效的原因及解决方案
这个问题的核心原因是Python 2和Python 3中/除法运算符的行为不一致,我来给你详细拆解下:
1. 两种版本的除法差异
- 在Python 2.7中,当两个整数使用
/进行除法运算时,会执行整数地板除(向下取整的整数除法)。比如31/32的结果是0,45/32的结果是1,再乘以32就得到了0和32,也就是你看到的(0, 32)。 - 在Python 3.6及以后的版本中,
/运算符会返回浮点数结果,不管操作数是不是整数。比如31/32得到0.96875,乘以32后还是31.0;45/32得到1.40625,乘以32后是45.0,所以最终输出(31.0, 45.0)。
2. 修复方案
要在Python 3中实现和Python 2一样的网格对齐效果,只需要把代码中的/替换为//运算符——//在两个版本中都表示整数地板除,行为完全一致。修改后的代码如下:
mouse_x, mouse_y = 31, 45 mse = [mouse_x, mouse_y] mse_snap = (((mse[0])//32)*32, ((mse[1])//32)*32) print(mse_snap)
运行这段代码,不管是Python 2还是Python 3,都会输出(0, 32),完美实现32x32网格的对齐效果。
额外说明(版本兼容)
如果需要让同一段代码在Python 2和Python 3中都保持一致的除法行为,也可以在Python 2的代码开头添加:
from __future__ import division
这会让Python 2中的/也像Python 3一样返回浮点数,但此时你仍然需要用//来执行地板除,才能得到正确的网格对齐结果。
内容的提问来源于stack exchange,提问作者Sam Tubb
相关产品推荐
相关产品推荐

