我想向某人展示如何使用is而不是==比较整数会失败。我认为这会起作用,但它没有:
>>> import copy
>>> x = 1
>>> y = copy.deepcopy(x)
>>> x is y
True
Run Code Online (Sandbox Code Playgroud)
对于更大的整数,我可以很容易地做到这一点:
>>> x = 500
>>> y = 500
>>> x is y
False
Run Code Online (Sandbox Code Playgroud)
我如何用较小的整数来演示相同的事情,这些整数通常可能用于 python 中的类似枚举的目的?
以下示例在 Python 2 和 3 中均失败:
>>> n=12345
>>> ((n**8)+1) % (n**4) is 1
False
>>> ((n**8)+1) % (n**4) == 1
True
Run Code Online (Sandbox Code Playgroud)
原因略有不同。Python 2 使用int小整数long类型和任意精度值类型。只有int类型是实习的,所以当1L返回a 时示例失败。
Python 3 仅使用任意精度类型(并将其重命名为int)。该示例失败,因为余数计算在内部计算值 1 并返回它。仅在创建对象并且该对象是在计算开始时创建的对象具有值 1 时才执行内部检查。