Python:或者条件不能正常工作,就像if else一样

Tom*_*yer -3 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)
Run Code Online (Sandbox Code Playgroud)

我测试了这个功能,它打印:

list
[]
['id']
['id']
Run Code Online (Sandbox Code Playgroud)

更改后exclude_list = column_exclude_list if type=='list' else column_exclude_edit,它的工作原理.

list
[]
['id']
[]
Run Code Online (Sandbox Code Playgroud)

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

Mar*_*ers 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'
Run Code Online (Sandbox Code Playgroud)

因为column_exclude_list是false值,and运算符会生成一个空列表,or运算符会生成另一个操作数.

这并不意味着andor破损或在Python的工作不同于他们在其他语言做.你刚才有没有考虑过,在一个<test> and <true expression> or <false expression>结构,即<true expression>仍然用于确定整个的结果.这适用于所有布尔逻辑,而不仅仅是Python.

不要使用andor用于条件表达式.使用实际的条件表达式,所以<true expression> if <test> else <false expression>:

column_exclude_list if type_ == 'list' else column_exclude_edit
Run Code Online (Sandbox Code Playgroud)

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