5

可能重复:
Python 中的字符串比较:is vs. ==

algorithm = str(sys.argv[1])
print(algorithm)
print(algorithm is "first")

我正在使用参数从命令行运行它first,那么为什么该代码输出:

first
False
4

3 回答 3

13

Python 文档

运算符 is 和 is not 测试对象身份:当且仅当 x 和 y 是同一个对象时,x is y 为真。

这意味着它不检查值是否相同,而是检查它们是否在相同的内存位置。例如:

>>> s1 = 'hello everybody'
>>> s2 = 'hello everybody'
>>> s3 = s1

注意不同的内存位置:

>>> id(s1)
174699248
>>> id(s2)
174699408

但由于s3等于s1,内存位置是相同的:

>>> id(s3)
174699248

使用is语句时:

>>> s1 is s2
False
>>> s3 is s1
True
>>> s3 is s2
False

但是如果你使用相等运算符:

>>> s1 == s2
True
>>> s2 == s3
True
>>> s3 == s1
True

编辑:只是为了混淆,有一个优化(无论如何在CPython中,我不确定它是否存在于其他实现中)它允许将短字符串与is

>>> s4 = 'hello'
>>> s5 = 'hello'
>>> id(s4)
173899104
>>> id(s5)
173899104
>>> s4 is s5
True

显然,这不是你想要依赖的东西。对工作使用适当的语句——is如果你想比较身份,==如果你想比较值。

于 2012-12-08T22:21:15.400 回答
5

你要:

algorithm = str(sys.argv[1])
print(algorithm)
print(algorithm == "first")

is检查对象身份(想想内存地址)。但是在您的情况下,对象具有相同的“值”,但不是相同的对象。

注意==弱于is。这意味着如果is返回 True,那么==也将返回 True,但反过来并不总是正确的。

于 2012-12-08T22:11:04.563 回答
3

基本上,is检查对象的地址(身份),而不是值。对于值比较使用==运算符

于 2012-12-08T22:11:51.227 回答