我在Python中发现了一些非常奇怪的行为。 我的一个学生做出某种错误试图找到属于两个列表元素,他写道:和Python列表上的运算符
list1 and list2
奇怪的行为是没有错误被Python 3被解雇了! list1 and list2
实际上得到的值是list2
。
是否有任何已知的原因呢?
我在Python中发现了一些非常奇怪的行为。 我的一个学生做出某种错误试图找到属于两个列表元素,他写道:和Python列表上的运算符
list1 and list2
奇怪的行为是没有错误被Python 3被解雇了! list1 and list2
实际上得到的值是list2
。
是否有任何已知的原因呢?
and
只是评估提供的两个值的真实性。 如果第一个是True
(请参阅bool(list1)
),则第二个评估和返回。如果第一个参数是False
(例如[] and list2
),它的值将立即返回。
在documentation on Boolean Operations这种行为的理由作了明确规定:
注意,无论是
and
也不or
限制他们回到False
和True
的价值和类型,而是返回最后一个变量。这有时是有用的,例如,如果s
是一个字符串,如果该字符串为空,则应该使用默认值替换,则表达式s or 'foo'
会生成所需的值。
(重点煤矿)
请注意,这种行为没有找到与not
它,而是返回根据所提供的参数一True
/False
值。
那么,如果他们都有值,那么“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认为真。
当您询问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]
非常感谢。这正是我不明白的地方。 –
不客气@Coulombeau。总是在Python文档中查看这样的行为,它通常隐藏在某处:-) –