2012-12-08 462 views

回答

10

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的,无论如何,我不知道这是否在其他实现方式存在),其允许短字符串与is进行比较:

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

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

+0

编辑是非常重要的,因为我测试了它,并且正在思考,wtf?很好的答案。 – Aerovistae

+1

哈哈在两年后我刚回到这个问题,很难相信自从那以后我有多远。 – Aerovistae

5

你想要:

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

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

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

+0

有什么区别? – Aerovistae

+0

'=='测试比较结果是否具有相同的值,'is'测试它们是否具有相同的'id'(大致相当于内存位置)。 –

+1

来自魔鬼的拥护者POV可以自由解释为什么'a ='a'; B = 'A'; a是b“'是真 –

3

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

相关问题