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。

4

3 回答 3

4

在第 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 中的链式赋值的更多信息

于 2013-07-19T07:47:02.413 回答
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
于 2013-07-19T07:46:22.540 回答
2

哈哈...这种表达式的python 评估并不像您对t = A[t] = A.count(3)表达式所期望的那样明显。在第一步中,最后的值是用 is 评估的1。然后先赋值给t再赋值给A[t],但此时t为1。

@Henrik 建议阅读有关链式作业的内容非常好。

实际上,您的示例自我解释了为什么它被认为是糟糕的编程实践

于 2013-07-19T07:47:58.550 回答