2016-11-05 52 views
2

我在Python中发现了一些非常奇怪的行为。 我的一个学生做出某种错误试图找到属于两个列表元素,他写道:和Python列表上的运算符

list1 and list2 

奇怪的行为是没有错误被Python 3被解雇了! list1 and list2实际上得到的值是list2

是否有任何已知的原因呢?

回答

4

and只是评估提供的两个值的真实性。 如果第一个是True(请参阅bool(list1)),则第二个评估和返回。如果第一个参数是False(例如[] and list2),它的值将立即返回。

documentation on Boolean Operations这种行为的理由作了明确规定:

注意,无论是and也不or限制他们回到FalseTrue的价值和类型,而是返回最后一个变量。这有时是有用的,例如,如果s是一个字符串,如果该字符串为空,则应该使用默认值替换,则表达式s or 'foo'会生成所需的值。

(重点煤矿)

请注意,这种行为没有找到not它,而是返回根据所提供的参数一True/False值。

+0

非常感谢。这正是我不明白的地方。 –

+1

不客气@Coulombeau。总是在Python文档中查看这样的行为,它通常隐藏在某处:-) –

1

那么,如果他们都有值,那么“if list1和list2:”应该返回True,它会继续到代码中的下一行。

a = 1 
if a: #This will be True since a is different then None or 0 
    print("Works") 
>>> Works 

b = 0 
if b: 
    print("Works") 
>>> 
This one returned nothing because b is 0 wich means that the "if b" will return False. 

另外,它会返回上列出真如果该列表中有ATLEAST 1元素:如果一个变量是不同的,那么没有或0 例 Python3认为真。

1

当您询问list1 and list2时,python会呼叫__bool__,list1list2。由于[]的计算结果为False,并且非空列表的计算结果为True,and依次查看list1list2,直到它找到一个空列表(或者它查找所有列表,如果从未找到空列表)。

最后,and表达式的计算结果为导致and失败的空列表或比较中的最后一个列表。这就是为什么你得到list2作为价值。

有趣的是,你可以使用这个行为,你的优势来设置默认值:

def func(arg=None): 
    arg = arg or [5] # now, [5] is the default value of arg 

这几乎是一样的做:

def func(arg=None): 
    if arg is None: 
     arg = [5]