Python:或者条件不能像if else

时间:2018-01-04 19:20:30

标签: python syntax conditional-statements

我正在使用python,我意识到它不可靠而有时候或语句没有理由不能正常工作

column_exclude_list = []}
column_exclude_edit = ['id']
def get_columns(type='list'):
    # exclude_list = column_exclude_list if type=='list' else column_exclude_edit
    exclude_list = type=='list' and column_exclude_list or column_exclude_edit

    print(type)
    print(column_exclude_list)
    print(column_exclude_edit)
    print(exclude_list)

我使用此功能测试并打印:

list
[]
['id']
['id']

更改为exclude_list = column_exclude_list if type=='list' else column_exclude_edit后,它可以正常工作。

list
[]
['id']
[]

这两个短手条件之间有什么不对?

1 个答案:

答案 0 :(得分:5)

您尚未考虑column_exclude_list 为空的情况。空列表是false-y值:

>>> type_ = 'list'
>>> column_exclude_list = []
>>> column_exclude_edit = 'column_exclude_edit'  # for demo purposes
>>> type_ == 'list' and column_exclude_list or column_exclude_edit
'column_exclude_edit'

由于column_exclude_list是false值,and运算符会生成一个空列表,而or运算符会生成另一个操作数。

这并不意味着andor在Python中的破坏或工作方式与在其他语言中的不同。您只是在<test> and <true expression> or <false expression>构造中没有考虑到,<true expression> 仍然用于确定整个的结果。这适用于所有布尔逻辑,而不仅仅是Python。

不要将andor用于条件表达式。使用实际的conditional expression<true expression> if <test> else <false expression>

column_exclude_list if type_ == 'list' else column_exclude_edit

andor类似,这会根据if测试的结果懒惰地评估两个操作数表达式中的任何一个。如果column_exclude_list为空,它仍将被返回,因为它的值不用于确定进一步布尔测试的结果。