2016-12-02 39 views
2

下面的代码是否安全使用if ... and ...:,即我们确定的第一个条件是先测试并且如果密钥不存在,第二个条件被忽略?测试密钥是否出现在字典中,并在相同的情况下做另一个测试

d = {'a': 1} 
if 'b' in d and d['b'] == 2: 
    print 'hello' 

看来是的,因为这不会产生错误。但是,所有Python版本都适用?

它不会生成KeyError: 'b'


PS:这可能是更Python,毫不含糊:

if 'b' in d: 
    if d['b'] == 2: 
     ... 
+1

是。 ''''''''或'是由语言保证的短路(正如我在[这个答案](http://stackoverflow.com/a/36551857/4014959)中所说明的),它不仅仅是一个实现细节。另外请注意,'all'和'any'功能短路;为了充分利用这种行为,你应该给他们发电机。 –

+0

更pythonic的方式,你可以做'如果d.get('b',None)== 2:',它将得到None如果键b不存在 – Skycc

+1

@Skycc如果你想默认值为'None' get()'那么它应该是'如果d.get('b')',因为如果没有找到它,它会自动返回'None'。第二个参数是用于定义一个自定义的默认值。 – roganjosh

回答

2

是的,它被称为短路和

两个python2(Link to the doc)和python3.x(Link to the doc)支持短路andor

+0

谢谢。你能添加一个引用链接和/或示例代码吗? – Basj

+0

@Basj我已经用doc链接更新了答案。希望能帮助到你 – nu11p01n73R

相关问题