我正在使用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']
[]
这两个短手条件之间有什么不对?
答案 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
运算符会生成另一个操作数。
这并不意味着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
为空,它仍将被返回,因为它的值不用于确定进一步布尔测试的结果。