我正在使用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']
[]
这两个短手条件之间有什么不对?
你没有说明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
运算符产生另一个操作数。
这并不意味着and
和or
在Python中的破坏或工作方式与其他语言不同。您还没有考虑过在<test> and <true expression> or <false expression>
构造中,<true expression>
仍然用于确定整体的结果。这适用于所有布尔逻辑,而不仅仅是Python。
不要将and
和or
用于条件表达式。使用实际的conditional expression,所以<true expression> if <test> else <false expression>
:
column_exclude_list if type_ == 'list' else column_exclude_edit
像and
和or
一样,这个懒惰地根据if
测试的结果评估两个操作数表达式中的任何一个。如果column_exclude_list
为空,它仍将被返回,因为它的值不用于确定进一步布尔测试的结果。