这个链分配如何工作?

时间:2013-07-19 07:40:50

标签: python variable-assignment

考虑以下代码;这是一个糟糕的编程习惯。我想知道为什么结果列表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 个答案:

答案 0 :(得分:3)

A.count(3)会产生1

首先执行

t = 1。现在t1

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建议阅读链式作业非常好。

实际上,您的示例会自我解释为什么它被视为糟糕的编程习惯