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

时间:2012-12-08 22:10:16

标签: python string

  

可能重复:
  String comparison in Python: is vs. ==

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

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

first
False

3 个答案:

答案 0 :(得分:12)

来自the Python documentation

  

运算符是和不是对象标识的测试:当且仅当x和y是同一个对象时,x是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中,我不确定它是否存在于其他实现中),它允许将短字符串与{{1}进行比较}:

is

显然,这不是你想要依赖的东西。如果要比较身份,请使用适当的作业声明 - >>> s4 = 'hello' >>> s5 = 'hello' >>> id(s4) 173899104 >>> id(s5) 173899104 >>> s4 is s5 True ;如果要比较值,请使用is

答案 1 :(得分:5)

你想:

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

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

请注意==弱于is。 这意味着如果is返回True,那么==也将返回True,但反之并非总是如此。

答案 2 :(得分:3)

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