考虑以下代码;这是一种糟糕的编程习惯。我想知道为什么结果列表A
是[1, 1, 3]
而不是[1, 2, 1]
. 从 Java 的角度来看,结果应该是[1, 2, 1]
. 谁能解释为什么这个结果是这样的?
A = [1, 2, 3]
t = 2
t = A[t] = A.count(3)
经过评估,A 是[1, 1, 3]
t 是1
。
我的 Python 版本是 3.3。
考虑以下代码;这是一种糟糕的编程习惯。我想知道为什么结果列表A
是[1, 1, 3]
而不是[1, 2, 1]
. 从 Java 的角度来看,结果应该是[1, 2, 1]
. 谁能解释为什么这个结果是这样的?
A = [1, 2, 3]
t = 2
t = A[t] = A.count(3)
经过评估,A 是[1, 1, 3]
t 是1
。
我的 Python 版本是 3.3。
在第 3 行,你有一个链式作业
t = A[t] = A.count(3)
t = A.count(3)
首先求值 -t
设置为A.count(3)
在本例中为 1 的返回值。然后将A
at index t
(=1) 的成员设置为 的返回值A.count(3)
,该值仍为 1。
在此处阅读有关 Python 中的链式赋值的更多信息
A.count(3)
产量1
。
t = 1
首先执行。现在t
是1
。
A[t] = 1
被执行。( A[1] = 1
)
>>> class Demo:
... def __setitem__(self, idx, value):
... print 'Set index', idx
...
>>> d = Demo()
>>> d[1] = d[2] = 2
Set index 1
Set index 2
哈哈...这种表达式的python 评估并不像您对t = A[t] = A.count(3)
表达式所期望的那样明显。在第一步中,最后的值是用 is 评估的1
。然后先赋值给t
再赋值给A[t]
,但此时t
为1。
@Henrik 建议阅读有关链式作业的内容非常好。
实际上,您的示例自我解释了为什么它被认为是糟糕的编程实践。