2016-02-01 16 views
5

Bằng cách nào đó sau khi làm điều nàyhành vi vòng lặp rất kỳ diệu: liệt kê các thay đổi nhận dạng. Điều gì đang xảy ra?

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 

đột nhiên id(list2)==id(list1) đánh giá là True? Cái quái gì đang xảy ra? trong khi vòng lặp chạy không có vẻ như trường hợp đầu ra đầu tiên như mong đợi:

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

thứ hai mặc dù mang lại cho:

0 0, 1 1, 2 2 ...

Làm thế nào có thể như vậy?

Đơn giản chỉ cần thay đổi mã để:

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

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

Gets thoát khỏi hành vi này.

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

Trả lời

6

Bạn viết:

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

Và sau đó:

for k, list1 in ... 

Bạn đang sử dụng cùng một tên list1 cho hai đối tượng khác nhau, nhưng trộn lẫn! Không có gì tốt đẹp sẽ thoát ra khỏi điều này.

Chỉ cần sử dụng một tên khác cho vòng lặp:

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

Hãy nhớ rằng trong Python chỉ có hai phạm vi, nói đại khái:

  • phạm vi mô-đun và
  • phạm vi chức năng.
2

Bạn đang tái gán list1 tại của bạn cho vòng lặp:

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

có nghĩa là ít lặp cuối cùng bạn đang ngầm làm list1 = list2

Từ docs

liệt kê() trả về một tuple chứa một số đếm (từ khởi động mặc định là 0) và các giá trị thu được từ itera ting trên dãy

+0

nhưng nên vòng lặp không tạo ra một biến mới trong namescope của vòng lặp? – pindakaas

+0

okay những gì địa ngục nó không thats điên – pindakaas

+0

@pindakaas: không, biến không giới hạn trong phạm vi vòng lặp. xem http://stackoverflow.com/questions/3611760/scoping-in-python-for-loops – Railslide

0

Trong vòng lặp for giá trị cuối cùng giao cho list1 ist list2 và đó là lý do tại sao sự bình đẳng đúng

Bạn đang mong đợi các biến trong vòng lặp for được giới hạn trong vòng lặp nhưng nó không phải trường hợp.Như trong:

for i in range(0, 2): 
    pass 

print(i) 

Những kết quả đầu ra:

1 
Các vấn đề liên quan