[Tutor] Query regarding output

Peter Otten __peter__ at web.de
Thu Jun 29 06:51:40 EDT 2017


Alan Gauld via Tutor wrote:

> On 29/06/17 03:14, shubham goyal wrote:
> 
>> This Question is asked in some exam. i am not able to figure it out.
>> 
>> a = [0, 1, 2, 3]
>> for a[-1] in a:
>>     print(a[-1])
>> 
>> its giving output 0 1 2 2
>> 
>> it should be 3 3 3 3 as a[-1] belongs to 3.
>> can anyone help me figuring it out.
> 
> This is quite subtle and it took me a few minutes to figure
> it out myself.
> 
> It might be clearer if we print all of 'a' instead
> of a[-1]:
> 
>>>> for a[-1] in a:
> ...    print(a)
> ...
> [0, 1, 2, 0]
> [0, 1, 2, 1]
> [0, 1, 2, 2]
> [0, 1, 2, 2]
> 
> What is happening is that a[-1] is being assigned the value
> of each item in a in turn. The final iteration assigns a[-1]
> to itself, thus we repeat the 2.
> 
> Another way to see it is to convert the for loop to
> a while loop:
> 
> for variable in collection:
>     process(variable)
> 
> becomes
> 
> collection = [some sequence]
> index = 0
> while index < len(collection):
>      variable = collection[index]
>      process(variable)
>      index += 1
> 
> Now substitute your values:
> 
> collection = [0,1,2,3]
> index = 0
> while index < len(collection):
>      collection[-1] = collection[index]
>      print(collection[-1])
>      index += 1
> 
> Does that help?

The simplest rewrite is probably

>>> a = [0, 1, 2, 3]
>>> for tmp in a:
...     a[-1] = tmp
...     print(tmp)
... 
0
1
2
2

which should clarify how the list is modified while iterating over it.
The takeaway is that

for ... in [value]:
    pass

is equivalent to

... = value

There are a few other implicit ways to assign a value, with varying 
generality:

>>> with open("tmp.txt") as a[0]: pass
... 

works, but

>>> import os as a[0]
  File "<stdin>", line 1
    import os as a[0]
                  ^
SyntaxError: invalid syntax

and

>>> try: 1/0
... except Exception as a[0]: pass
  File "<stdin>", line 2
    except Exception as a[0]: pass
                         ^
SyntaxError: invalid syntax

are forbidden by the language. 

The only case -- other than standard name binding -- I find useful is 
unpacking in a for loop:

>>> for hi, lo in ["Aa", "Zz"]:
...   print(hi, "-", lo)
... 
A - a
Z - z




More information about the Tutor mailing list