关于python:为什么这个字符串比较返回False?

Why is this string comparison returning False?

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
String comparison in Python: is vs. ==

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

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

1
2
first
False


从python文档中:

The operators is and is not test for object identity: x is y is true if and only if x and y are the same object.

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

1
2
3
>>> s1 = 'hello everybody'
>>> s2 = 'hello everybody'
>>> s3 = s1

注意不同的内存位置:

1
2
3
4
>>> id(s1)
174699248
>>> id(s2)
174699408

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

1
2
>>> id(s3)
174699248

使用is语句时:

1
2
3
4
5
6
>>> s1 is s2
False
>>> s3 is s1
True
>>> s3 is s2
False

但如果使用相等运算符:

1
2
3
4
5
6
>>> s1 == s2
True
>>> s2 == s3
True
>>> s3 == s1
True

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

1
2
3
4
5
6
7
8
>>> s4 = 'hello'
>>> s5 = 'hello'
>>> id(s4)
173899104
>>> id(s5)
173899104
>>> s4 is s5
True

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


你想要:

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

is检查对象标识(think memory address)。但在您的例子中,对象具有相同的"值",但不是相同的对象。

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


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