2016-02-01 17 views
5

Jakoś po zrobieniu tegoBardzo dziwne zachowanie pętli: lista zmienia tożsamość. Co się dzieje?

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 

nagle id(list2)==id(list1) oceniona prawda? Co się dzieje na ziemi? podczas gdy pętla jest uruchomiony to nie wydaje się, aby pszczoły sprawę pierwsze wyjście jest zgodnie z oczekiwaniami:

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

drugi choć daje:

0 0 1 1 2 2 ...

Jak to możliwe?

Wystarczy zmiany kodu do:

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

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

pozbywa się tego zachowania.

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

Odpowiedz

6

Piszesz:

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

, a następnie:

for k, list1 in ... 

Używasz tej samej nazwy list1 dla dwóch różnych, ale wymieszanych przedmiotów! Nic dobrego nie wyjdzie z tego.

Wystarczy użyć innej nazwy dla pętli:

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

Pamiętaj, że w Pythonie istnieją tylko dwa zakresy, z grubsza rzecz biorąc:

  • modułu zakres i
  • zakres funkcji.
2

Jesteś ponownie przypisując list1 w swojej pętli for:

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

co oznacza, że ​​w ostatniej iteracji jesteś niejawnie robi list1 = list2

Z docs

enumerate() zwraca krotkę zawierającą liczbę (od początku, która domyślnie wynosi 0) i wartości uzyskane z itery ting nad sekwencją

+0

ale powinny pętla nie utworzyć nową zmienną w namescope pętli? – pindakaas

+0

dobrze, co do diabła, to nie jest szalone – pindakaas

+0

@pindakaas: nie, zmienna nie jest ograniczona do zakresu pętli for. zobacz http://stackoverflow.com/questions/3611760/scoping-in-python-for-loops – Railslide

0

w pętli ostatnia wartość przypisana do list1 ist list2 i dlatego równość jest prawdziwa

Ty oczekujesz zmiennych w pętli for zostać ograniczone do pętli, ale to nie jest walizka.Jak w:

for i in range(0, 2): 
    pass 

print(i) 

które wyjścia:

1