我的代码中的行被跳过,我不知道为什么

时间:2016-11-05 22:05:07

标签: python-2.7

我正在使用python 2.7,我对python很新。我想问为什么我的代码中的行被跳过了,虽然我没有看到它们的原因。

我的代码如下所示:

def add_client:
    code for adding client

def check_clients:
    code for listing out client info

modes = {'add': add_client, 'check': check_clients}        
while True:
    while True:
        action = raw_input('Input Action: \n').lower()
        if action in modes or ['exit']:
            break
        print 'Actions available:',
        for i in modes:
            print i.title() + ',',
        print 'Exit' 

    if action in modes:
        modes[mode](wb)

    if action == 'exit':
        break

当我运行代码并输入不在模式列表中的操作时,它不会打印出'可用的操作:添加,检查,退出'似乎只是跳过如下所示。

Input Action:
k
Input Action:

如果我将代码更改为下面所示的代码,则按预期工作:

modes = {'add': add_entries, 'check': check_stats}        
while True:
    while True:
        mode = raw_input('Input Action: \n').lower()
        if mode not in modes:
            print 'Actions available:',
            for i in modes:
                print i.title() + ',',
            print 'End/Exit' 
        if mode in modes or ['end', 'exit']:
            break

    if mode in modes:
        modes[mode](wb)

    if mode in ['end', 'exit']:
        break

输出:

Input Action:
k
Actions available: Add, Check, End/Exit

根据我的理解,我认为当if语句为false时,将跳过if语句中的代码,并且应该运行下面的代码,但由于某种原因,这似乎不是这里的情况。 。是否有理由或我对if语句的理解不正确?

1 个答案:

答案 0 :(得分:2)

无论action in modes or ['exit']的值如何,条件True的评估结果为action。它读作(action in modes) or (['exit'])(因此您将or运算符应用于操作数action in modes['exit'])。非空列表['exit']在布尔上下文中求值为True,因此or返回True。建议您在此处使用action in modes or action == 'exit'来实现目标。