2017-02-25 39 views
1

我在学习为什么以下不起作用:if else语句与python中的字典

我有一本字典;

ex = {'CA':'San Francisco', 'NV':'Las Vegas'} 

我试图用if else语句获取'yes'

>>> if ex['CA'] is 'San Francisco': 
...  print 'yes' 
... else: 
...  print 'no' 
... 
no 

>>> 
>>> 
>>> if ex['CA'] == 'San Francisco' is True: 
...  print 'yes' 
... else: 
...  print 'no' 
... 
no 

>>> if ex['CA'] == 'San Francisco' is True: 
...  print 'yes' 
... 
>>> 

在这里,我没有得到'yes'

我想知道为什么我没有收到'yes'

>>> ex['CA'] == 'San Francisco' 
True 

>>> ex['CA'] 
'San Francisco' 

会是什么如果我想使用字典的键的条件语句等于某个值,还有其他方法吗?

+1

运算符优先级:'if(前['CA'] =='旧金山')为真' –

+4

不要使用'is'来比较字符串。 –

回答

3

你比较ex['CA']'San Francisco'(这是OK)后,您比较'San Francisco'True总是失败:结果始终为假(编辑正确性:根本原因被描述错误,但修复是相同的)

所以代码没有做你认为它在做什么。

这会工作:

if (ex['CA'] == 'San Francisco') is True: 

但Python的方式仍然是:

if ex['CA'] == 'San Francisco': 

is True是有效的,但我想它保留一个非常特别的使用,当你要区分非零值如12(或甚至1)从True

其他用法使其成为冗余。

顺便说一句,我不能让你写if ex['CA'] is 'San Francisco':并摆脱它。你使用==True是一个单身人士,所以is的作品,但不能保证字符串,它是依赖于实现。有关更多详细信息,请参阅Python string interning

+4

注意:使用'is True' *可以使有效代码错误,即使对于== ==的结果是True,它在技术上也不等同于简单的真实性测试。 '__eq__'被允许返回任何旧对象,而不仅仅是'True' /'False',所以如果括号为'(ex ['CA'] =='San Francisco')为True'且'ex ['CA' ]'是一些自定义对象,带有一个非标准的'__eq__',例如返回等于'1',不等于'0',与'True'的标识比较将始终为假(1等于到'True',但它们不是同一个对象;如果'__eq__'返回'2',它甚至不等于'True')。 – ShadowRanger

+0

@ShadowRanger:棘手但真实。 –

+0

该问题与运算符优先级无关,只是链接比较运算符的工作原理。基本上,'ex ['CA'] =='旧金山'为True'等同于'ex ['CA'] =='旧金山'和'旧金山'为真',就像'a stranac