Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

very wonderous loop behavior: lists changes identity. What is happening?

Somehow after doing this

list2 = [x for x in range(10)]

list1 = [ x for x in range(10,20)]

 for k, list1 in enumerate([list1,list2]):
    for number, entry in enumerate(list1):
        print number, entry 

suddenly id(list2)==id(list1) evaluated to True? What on earth is happening? while the loop is running this does not seem to bee the case the first output is as expected :

0 10, 1 11, 2 12,...0 0, 1 2, 2 3,...

the second though gives:

0 0, 1 1, 2 2...

How is this possible?

Simply changing the code to:

list2 = [x for x in range(10)]

list1 = [ x for x in range(10,20)]

Gets rid of this behaviour.

 for k, NEWVAR in enumerate([list1,list2]):
    for number, entry in enumerate(list1):
        print number, entry 
like image 564
pindakaas Avatar asked Feb 01 '16 11:02

pindakaas


2 Answers

You write:

list1 = [ x for x in range(10,20)]

And then:

for k, list1 in ...

You are using the same name list1 for two different, but intermixed objects! Nothing good will come out of this.

Just use a different name for the loop:

for k, l in enumerate([list1,list2]):
    for number, entry in enumerate(l):

Remember that in Python there are only two scopes, roughly speaking:

  • module scope and
  • function scope.
like image 81
rodrigo Avatar answered Oct 19 '22 07:10

rodrigo


You are re-assigning list1 in your for loop:

for k, list1 in enumerate([list1,list2]):

which means that at the last iteration you're implicitly doing list1 = list2

From the docs

enumerate() returns a tuple containing a count (from start which defaults to 0) and the values obtained from iterating over sequence

like image 25
Railslide Avatar answered Oct 19 '22 07:10

Railslide