关于list
首先,这是非常重要的一点,一切都会随之发生(我希望)。
在普通的Python里,list
在任何方面都没有什么特别之处(除了构造时有可爱的语法,这主要是历史上的意外)。一次[3,2,6]
,就所有意图和目的而言,它只是一个普通的Python对象,就像一个数字。3
,集{3,7}
,或者一个函数lambda x: x+5
.
(是的,它支持更改元素,支持迭代和许多其他东西,但这正是类型:它支持一些操作,而不支持其他一些操作。int支持提升到一个能力,但这并不意味着它很特别-它就是int。Lambda支持调用,但这并不意味着它很特别-毕竟,lambda就是这样做的:)。
关于and
and
不是运算符(您可以称它为“运算符”,但也可以调用“for”操作符:)。Python中的运算符是通过调用某些类型的对象的方法实现的,通常是作为该类型的一部分编写的。一个方法无法对其一些操作数进行评估,但是and
能够(而且必须)做到这一点。
结果就是and
不能超载,就像for
不能超载。它是完全通用的,并通过指定的协议进行通信。你能,会,可以是自定义协议的一部分,但这并不意味着您可以更改and
完全地。议定书是:
想象一下Python对“a和b”的解释(这并不是这样的,但它有助于理解)。当提到“and”时,它会查看它刚刚计算过的对象(A),并问它:“您是真的吗?”不*你是True
?)如果您是一个类的作者,您可以自定义这个答案。如果a
回答“不”,and
(完全跳过b,根本不对其进行评估,)说:a
是我的成绩(不:错误是我的结果)。
如果a
不回答,and
问它:你的长度是多少?(同样,您可以将其自定义为a
),如果a
答案0,and
是否与上述相同-认为它是假的(不),跳过b,并给出a
结果。
如果a
回答第二个问题(“你的长度是多少”),或者它根本没有回答,或者对第一个问题回答“是”(“你是真的”),and
评估b,并说:b
是我的结果。注意它确实有不问b
任何问题。
换句话说,所有这些都是a and b
几乎和b if a else a
,除非a只计算一次。
现在用笔和纸坐几分钟,让自己相信,当{a,b}是{True,false}的子集时,它的工作原理与布尔运算符完全一样。但我希望我已经说服你,它是更一般,正如你会看到,更有用的方式。
把这两者结合起来
现在我希望你理解你的例子1。and
不管mylist 1是一个数字、列表、lambda还是一个类argmhbl的对象。它只关心mylist 1对协议问题的回答。当然,mylist 1回答了关于长度的问题,所以返回mylist 2。仅此而已。这与mylist 1和mylist 2的元素无关-它们不会在任何地方输入图片。
第二个例子:&
在……上面list
另一方面,&
操作员和其他人一样,就像+
例如。可以通过在该类上定义特殊方法来定义类型。int
将其定义为按位“和”,bool将其定义为逻辑“和”,但这只是一个选项:例如,set和一些其他对象(如dict键视图)将其定义为集交集。list
只是没有定义它,可能是因为Guido没有想到任何明显的方法来定义它。
蒙皮
在另一条腿上:-D,numpy数组是特别,或者至少他们想成为。当然,numpy.Array只是一个类,它不能覆盖and
无论如何,它也做了次好的事情:当被问到“你是真的”时,numpy.Array会引发一个ValueError,有效地说“请重新表述这个问题,我对真相的看法不适合你的模型”。(请注意,ValueError消息没有提到and
-因为numpy.Array不知道谁就是问它这个问题,它只是在说真理。)
为&
完全不同的故事。数组可以根据自己的意愿定义它,并定义&
与其他运营商保持一致:点态。所以你终于得到了你想要的。
HTH,