可能重复:
String comparison in Python: is vs. ==为什么这个字符串比较返回False?
algorithm = str(sys.argv[1])
print(algorithm)
print(algorithm is "first")
我从参数first
在命令行中运行它,那么,为什么这些代码的输出:
first
False
可能重复:
String comparison in Python: is vs. ==为什么这个字符串比较返回False?
algorithm = str(sys.argv[1])
print(algorithm)
print(algorithm is "first")
我从参数first
在命令行中运行它,那么,为什么这些代码的输出:
first
False
的运营商是并没有测试对象标识: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的,无论如何,我不知道这是否在其他实现方式存在),其允许短字符串与is
进行比较:
>>> s4 = 'hello'
>>> s5 = 'hello'
>>> id(s4)
173899104
>>> id(s5)
173899104
>>> s4 is s5
True
显然,这是不是你想要依靠的东西。如果要比较身份,请使用适当的语句作为工作 - is
,如果要比较值,请使用==
。
编辑是非常重要的,因为我测试了它,并且正在思考,wtf?很好的答案。 – Aerovistae
哈哈在两年后我刚回到这个问题,很难相信自从那以后我有多远。 – Aerovistae
你想要:
algorithm = str(sys.argv[1])
print(algorithm)
print(algorithm == "first")
is
检查对象身份(认为内存地址)。 但在你的情况下,对象具有相同的“值”,但不是相同的对象。
请注意==
弱于is
。 这意味着如果is
返回True,那么==
也将返回True,但反过来并不总是如此。
有什么区别? – Aerovistae
'=='测试比较结果是否具有相同的值,'is'测试它们是否具有相同的'id'(大致相当于内存位置)。 –
来自魔鬼的拥护者POV可以自由解释为什么'a ='a'; B = 'A'; a是b“'是真 –
基本上,is
检查对象的地址(身份),而不是值,。对于值比较使用==
操作者
其他重复:http://stackoverflow.com/questions/1504717/why-does-comparing-strings-in-python-using-either-or-is-sometimes-produce –