将两个变量与'is'运算符进行比较,这些运算符在Python中的一行中声明

ni8*_*8mr 10 python python-2.7

根据文件:

当前实现保持整数对象对之间的所有整数数组-5256,当您创建在该范围内的int你其实只是回到现有对象的引用.所以应该可以改变它的值1.我怀疑在这种情况下Python的行为是未定义的.:-)

所以以下行为是正常的.

>>> a = 256
>>> b = 256
>>> a is b
True
>>> c = 257
>>> d = 257
>>> c is d
False
Run Code Online (Sandbox Code Playgroud)

但是当我宣布这样的两个变量时,我变得正确 -

>>> e = 258; f=258;
>>> e is f
True
Run Code Online (Sandbox Code Playgroud)

我检查了e和f-引用的对象的身份

>>> id(e)
43054020
>>> id(f)
43054020
Run Code Online (Sandbox Code Playgroud)

他们是一样的.

我的问题是当我们用分号分隔e和f时发生了什么?为什么它们引用同一个对象(尽管这些值超出了Python的整数对象数组的范围)?

如果你能解释它,就像你向初学者解释一样,那就更好了.

alf*_*sin 5

不是一个意外的行为,根据Python Data模型,它是一个实现细节:

类型几乎影响对象行为的所有方面.甚至对象标识的重要性在某种意义上也受到影响:对于不可变类型,计算新值的操作实际上可以返回对具有相同类型和值的任何现有对象的引用,而对于可变对象,这是不允许的.例如,在a = 1之后; b = 1,a和b可能会或可能不会引用具有值1的同一对象,具体取决于实现,但在c = []之后; d = [],c和d保证引用两个不同的,唯一的,新创建的空列表.(注意c = d = []将同一个对象分配给c和d.)