考虑以下代码;这是一种糟糕的编程习惯。我想知道为什么结果列表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 的返回值。然后将Aat 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 建议阅读有关链式作业的内容非常好。
实际上,您的示例自我解释了为什么它被认为是糟糕的编程实践。