在python3中使用floor division时(可能还有未来的 python2 ),例如in
>>> 2//2
1
Run Code Online (Sandbox Code Playgroud)
输出是预期的整数.但是只要一个操作数是浮点数,就会得到一个浮点数
>>> 2.0//2.0
1.0
>>> 2.0//2
1.0
>>> 2//2.0
1.0
Run Code Online (Sandbox Code Playgroud)
我想这是有意的,但实际上我不明白,为什么它应该是这样的.作为总是产生整数的操作的结果,使用先前未确定的数据类型的设计概念是什么?
最好的广泛搜索给了我(来自PEP 238)
楼层划分的语义
分区将在所有Python数字类型中实现,并具有语义
Run Code Online (Sandbox Code Playgroud)a // b == floor(a/b)除了结果类型将是在操作之前强制a和b进入的公共类型.
具体来说,如果a和b属于同一类型,则// b也属于该类型.如果输入具有不同类型,则首先使用与所有其他算术运算符相同的规则将它们强制转换为公共类型.
特别是,如果a和b都是int或long,则结果与这些类型的经典除法具有相同的类型和值(包括混合输入类型的情况; int // long和long // int将返回a长).
对于浮点输入,结果是浮点数.例如:
Run Code Online (Sandbox Code Playgroud)3.5//2.0 == 1.0对于复数,//引发异常,因为不允许复数的floor().
对于用户定义的类和扩展类型,所有语义都取决于类或类型的实现.
但这仍然没有解释为什么行为是这样实现的.