和Python列表上的运算符

时间:2016-11-05 19:39:07

标签: python python-3.x operators

我在Python中发现了一些非常奇怪的行为。 他写道:我的一个学生在尝试找到属于两个列表的元素时犯了一些错误,他写道:

list1 and list2

奇怪的行为是Python 3没有触发错误! list1 and list2实际上有一个list2的值。

这有什么原因吗?

3 个答案:

答案 0 :(得分:4)

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

documentation on Boolean Operations中明确说明了这种行为的基本原理:

  

请注意,andor都不会限制返回FalseTrue的值和类型,而是返回上次评估的参数。这有时是有用的,例如,如果s是一个字符串,如果它是空的,则应该用默认值替换,表达式s or 'foo'产生所需的值。

(强调我的)

请注意,not未找到此行为 ,而是根据提供的参数返回True / False值。

答案 1 :(得分:1)

好吧,如果它们都有值,那么“if list1和list2:”应该返回True,它将继续到代码中的下一行。 如果变量与None或0不同,Python3会认为是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.

此外,如果列表中至少包含1个元素,它将在列表上返回True。

答案 2 :(得分:1)

当您询问list1 and list2时,python会调用__bool__list1上的list2。由于[]评估为False,而非空列表评估为Trueand依次查看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]

这几乎与做:

<link href="<c:url value="/resources/css/main.css" />" rel="stylesheet">
<spring:url value="/resources/css/main.css" var="mainCss" />
<link type="text/css" href="${pageContext.request.contextPath}/css/main.css" rel="stylesheet" />