考虑以下代码;这是一个糟糕的编程习惯。我想知道为什么结果列表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。
答案 0 :(得分:3)
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
答案 1 :(得分:3)
在第3行,您有一个链式分配
t = A[t] = A.count(3)
首先评估 t = A.count(3)
- t
设置为A.count(3)
的返回值,在这种情况下为1。
然后,索引为A
(= 1)的t
成员设置为A.count(3)
的返回值,该值仍为1.
阅读有关Python here
中链式作业的更多信息答案 2 :(得分:2)
哈哈......这种表达式的python评估并不像你对t = A[t] = A.count(3)
表达式所期望的那样明显。在第一步中,结尾处的值使用1
进行评估。然后,它首先分配到t
,然后分配到A[t]
,但此时t
为1。
@Henrik建议阅读链式作业非常好。
实际上,您的示例会自我解释为什么它被视为糟糕的编程习惯。