为什么这个字符串比较返回False?

tem*_*ame 4 python string

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

algorithm = str(sys.argv[1])
print(algorithm)
print(algorithm is "first")
Run Code Online (Sandbox Code Playgroud)

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

first
False
Run Code Online (Sandbox Code Playgroud)

Bla*_*air 12

Python文档:

运算符是和不是对象标识的测试:当且仅当x和y是同一个对象时,x是y.

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

>>> s1 = 'hello everybody'
>>> s2 = 'hello everybody'
>>> s3 = s1
Run Code Online (Sandbox Code Playgroud)

请注意不同的内存位置:

>>> id(s1)
174699248
>>> id(s2)
174699408
Run Code Online (Sandbox Code Playgroud)

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

>>> id(s3)
174699248
Run Code Online (Sandbox Code Playgroud)

使用is语句时:

>>> s1 is s2
False
>>> s3 is s1
True
>>> s3 is s2
False
Run Code Online (Sandbox Code Playgroud)

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

>>> s1 == s2
True
>>> s2 == s3
True
>>> s3 == s1
True
Run Code Online (Sandbox Code Playgroud)

编辑:只是令人困惑,有一个优化(无论如何,在CPython中,我不确定它是否存在于其他实现中),它允许将短字符串与以下内容进行比较is:

>>> s4 = 'hello'
>>> s5 = 'hello'
>>> id(s4)
173899104
>>> id(s5)
173899104
>>> s4 is s5
True
Run Code Online (Sandbox Code Playgroud)

显然,这不是你想要依赖的东西.对作业使用适当的语句 - is如果要比较标识,并且==要比较值.

  • 呵呵,两年后,我的苦恼让我回到了这个问题,从那时起我很难相信我走了多远。 (2认同)

Pet*_*nov 5

你要:

algorithm = str(sys.argv[1])
print(algorithm)
print(algorithm == "first")
Run Code Online (Sandbox Code Playgroud)

is检查对象标识(想想内存地址).但在您的情况下,对象具有相同的"值",但不是相同的对象.

注意==比弱is.这意味着如果is返回True,那么==也将返回True,但反过来并不总是如此.