python 是否为一个 int 和许多引用存储一个值?

Does python store one value for an int and many references?

我想知道为什么它的计算结果为 True

x = 1
if x is 1:
    print "Does x and 1 point to the same object?"
    print "Does this mean python doesn't store redundant values?"

如我所料,它不适用于这种情况。

x = range(10)
y = range(10)
if not x is y:
    print "I expect this"

我的理解是 is 检查两个名称是否指向同一个对象。这是否意味着 python 具有避免创建冗余值的机制?

这是 CPython 解释器的一个实现细节,但是具有小值的整数是 "interned" -- 只要表达式的结果落在某个范围内,就会返回一个现有的具有相同值的 int 对象.

您可以使用以下代码查看被 intern 的范围:

interned_range = [i for i in range(-1000, 1000) if i+0 is i]
print min(interned_range), max(interned_range)

我的 CPython 在 -5 到 256 之间插入整数。

作为实现细节,通常不应依赖此行为。