"和"的影响在分配和增加

时间:2015-10-22 20:18:17

标签: python

一行代码绊倒了我:

>>> i = 1
>>> j = 1
>>> i += j > 0 and i
>>> print(i)
 2

使这项工作的基础机制或系统是什么?它似乎是i = i + i if j > 0 else i的语法糖,但打包时要解决很多问题。我错了吗?是否有其他系统在发挥我不知道?

谢谢!

修改

为清楚起见:

>>> i = 3
>>> j = 2
>>> i += j > 1 and i
>>> i
6

2 个答案:

答案 0 :(得分:6)

让我们分解一下:

In [1]: i = 1

In [2]: j = 1

现在,让我们看一下表达式i += j > 0 and i

In [3]: j > 0
Out[3]: True

由于j 1大于0,因此评估为True

In [4]: j > 0 and i
Out[4]: 1

因为j > 0True,所以布尔表达式的值是右侧的值,即1

因此,i += j > 0 and i简化为i += ii = i + i

In [5]: i += i

In [6]: i
Out[6]: 2

我们还要考虑你的第二个例子:

>>> i = 3
>>> j = 2
>>> i += j > 1 and i
>>> i
6

对于第三行,我们有这些变换:

i += j > 1 and i
i = i + (j > 1 and i)
i = 3 + (2 > 1 and 3)
i = 3 + (True and 3)
i = 3 + 3
i = 6

答案 1 :(得分:4)

在Python andor中,不返回布尔值,而是返回提供给它们的一个选项,其中计算为正确的布尔值。

例如,and将返回遇到的第一个False值或最后一个True值:

>>> 1 and 3
3

>>> 1 and 0
0

同样,or将返回它遇到的第一个True值,否则返回第一个False值:

>>> 2 or 3
2

>>> 0 or 2
2

>>> False or 0
0

基本上,您应该记住,andor不一定会返回True / False,但会返回提交给它们的其中一个元素,评估为TrueFalse