3

Consider the following code; it is a bad programming practice. I am wondering why the resulting list A is [1, 1, 3] rather than [1, 2, 1]. From the view of Java, the result should be [1, 2, 1]. Can anyone explain why this result is what it is?

A = [1, 2, 3]
t = 2
t = A[t] = A.count(3)

After evaluation, A is [1, 1, 3] and t is 1.

My Python version is 3.3.

Makoto
  • 104,088
  • 27
  • 192
  • 230
hiway
  • 3,906
  • 10
  • 34
  • 57

3 Answers3

4

On line 3 you have a chained assignment

t = A[t] = A.count(3)

t = A.count(3) is evaluated first – t set to the return value of A.count(3) which in this case is 1. Then the member of A at index t(=1) is set to the return value of A.count(3), which is still 1.

Read more about chained assignments in Python here

Community
  • 1
  • 1
Henrik
  • 4,254
  • 15
  • 28
3

A.count(3) yields 1.

t = 1 is executed first. Now t is 1.

A[t] = 1 is executed. (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
falsetru
  • 357,413
  • 63
  • 732
  • 636
2

Haha... The python evaluation of such expression in not as obvious as you may expect from the t = A[t] = A.count(3) expression. In first step the value at the end is evaluated with is 1. Then it is first assigned to t and then to A[t], but at this time t is 1.

Suggestion by @Henrik to read about chained assignments is very good.

Actually, your example self-explain why it is perceived as bad programming practice.

Michał Fita
  • 1,183
  • 1
  • 7
  • 24