不恰当使用"不是"比较的奇怪的Python行为?

kmc*_*eng 2 python syntax-error

我(错误地?)在比较中使用'不是'并发现了这种奇怪的行为:

>>> a = 256
>>> b = int('256')
>>> c = 300
>>> d = int('300')
>>>
>>> a is not b
False
>>> c is not d
True
Run Code Online (Sandbox Code Playgroud)

显然我应该使用:

>>> a != b
False
>>> c != d
False
Run Code Online (Sandbox Code Playgroud)

但是由于小型测试案例,它在很长一段时间内都有效,直到我碰巧使用了495个.

如果这是无效的语法,那么为什么呢?我不应该至少得到警告吗?

mav*_*vnn 5

"is"不是对值相等的检查,而是检查两个变量指向对象的同一实例.

ints和strings对此感到困惑,is并且==由于语言内部的工作方式,可能会产生相同的结果.


ada*_*amk 5

对于较小的数字,Python正在重用对象实例,但对于较大的数字,它会为它们创建新的实例.

看到这个:

>>> a=256
>>> b=int('256')
>>> c=300       
>>> d=int('300')

>>> id(a)
158013588
>>> id(b)
158013588
>>> id(c)
158151472
>>> id(d)
158151436
Run Code Online (Sandbox Code Playgroud)

这就是为什么ab的,但c 不是 d.