【发布时间】:2017-06-09 22:37:06
【问题描述】:
在 Python 交互式会话中:
In [1]: a = "my string"
In [2]: b = "my string"
In [3]: a == b
Out[3]: True
In [4]: a is b
Out[4]: False
In [5]: import sys
In [6]: print(sys.version)
3.5.2 (default, Nov 17 2016, 17:05:23)
[GCC 5.4.0 20160609]
另一方面,当运行以下程序时:
#!/usr/bin/env python
import sys
def test():
a = "my string"
b = "my string"
print(a == b)
print(a is b)
if __name__ == "__main__":
test()
print(sys.version)
输出是:
True
True
3.5.2 (default, Nov 17 2016, 17:05:23)
[GCC 5.4.0 20160609]
为什么a is b在上述两种情况下结果不同?
我知道this 的答案(当然还有== 和is 运算符之间的区别!这是问题的重点!)但不是@987654329 @ 和 b 在第一种情况下也是同一个对象吗? (interpeter?)因为它们指向相同的(不可变的)字符串?
【问题讨论】:
-
您必须检查 cpython 源代码,但我想 python 解释器足够聪明,可以意识到这两个字符串是相同的,并且由于字符串是不可变的,因此可以安全地指向两者变量到同一个实例。因此,
is检查返回 true。对于 REPL,因为字符串是增量输入的,所以没有这样的优化机会,两个变量都引用不同的对象。 -
@AminEtesamian 据我了解,问题在于为什么在使用解释器时 id 不同,但在运行 .py 文件时却相同。我认为 pkaramol 了解 is 和 == 之间的区别。
-
我相信 Paul 是正确的,在解释的时候有一个自省和重用的机会,在解释器中它只是制造了一个新的对象。
标签: python string python-3.5 equality