我在Python中发现了一些非常奇怪的行为。 他写道:我的一个学生在尝试找到属于两个列表的元素时犯了一些错误,他写道:
list1 and list2
奇怪的行为是Python 3没有触发错误!
list1 and list2
实际上有一个list2
的值。
这有什么原因吗?
答案 0 :(得分:4)
and
只是评估所提供的两个值的真实性。
如果第一个是True
(参见bool(list1)
),则评估并返回第二个。如果第一个参数是False
(例如[] and list2
),则立即返回其值。
在documentation on Boolean Operations中明确说明了这种行为的基本原理:
请注意,
and
和or
都不会限制返回False
和True
的值和类型,而是返回上次评估的参数。这有时是有用的,例如,如果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
,而非空列表评估为True
,and
依次查看list1
和list2
,直至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" />