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

问题描述 投票:-3回答:1

我正在使用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']
[]

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

python syntax condition
1个回答
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是一个假值,所以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为空,它仍将被返回,因为它的值不用于确定进一步布尔测试的结果。

© www.soinside.com 2019 - 2024. All rights reserved.