【发布时间】:2019-03-25 23:00:14
【问题描述】:
在python中,两个代码有不同的结果:
a = 300
b = 300
print (a==b)
print (a is b) ## print True
print ("id(a) = %d, id(b) = %d"%(id(a), id(b))) ## They have same address
但在shell模式下(交互模式):
>>> a = 300
>>> b = 300
>>> a is b
False
>>> id(a)
4501364368
>>> id(b)
4501362224
"is" 运算符有不同的结果。
【问题讨论】:
-
@Aran-Fey:以这种方式比较什么类型的对象并不那么重要,但在这种特殊情况下,这是因为编译
.py源文件的实体注意到 300 == 300 所以只创建了一个 300 实例,而读取>>>行的解释器没有注意到 300 == 300 所以创建了两个单独的 300 实例。 -
不过,
is用于对象标识。只有在你想要的时候才使用它。 -
@Chris 我认为这也不能真正回答问题。就像 torek 所说,这个问题是关于在 REPL 中运行相同代码与作为脚本运行相同代码之间的区别。
-
正如@Chris 所说。换句话说,具有相同值的两个不可变对象的身份是偶然的,并且不能保证/要求。为什么它一次匹配而一次不匹配因此无关紧要。
-
伙计们,这些答案都没有真正回答这个问题。 :-(