2012-03-09 24 views

Trả lời

9

locals()['_[1]'] là một cách để truy cập tham chiếu đến kết quả hiện tại của danh sách hiểu (hoặc máy phát) trong danh sách đó.

Nó là khá một điều ác, nhưng có thể tạo ra kết quả buồn cười:

>> [list(locals()['_[1]']) for x in range(3)] 
[[], [[]], [[], [[]]]] 

Xem thêm chi tiết tại đây: the-secret-name-of-list-comprehensions.

+9

Không chỉ là nó một cách chi tiết thi hành ác, nó đã được gỡ bỏ bằng Python 2.7. Không sử dụng nó. – Duncan

1

locals() từ tài liệu Python:

Cập nhật và gửi lại một cuốn từ điển đại diện cho bảng ký hiệu cục bộ hiện hành. Các biến miễn phí được trả về bởi người dân địa phương() khi nó được gọi trong các khối chức năng, nhưng không được gọi trong các khối lớp.

Tôi không thể thấy lý do tại sao locals() được sử dụng trong một lớp lót đó, có thể nó không chung chung như bạn muốn.

Nếu bạn đang cố gắng để loại bỏ bản sao từ một danh sách Tôi nghĩ rằng sự lựa chọn tốt nhất là chuyển nó sang một set:

In [2]: l = [1,1,3,4,2,4,6] 
In [4]: set(l) 
Out[4]: set([1, 2, 3, 4, 6]) 

Nếu bạn muốn có một danh sách một lần nữa:

In [5]: list(set(l)) 
Out[5]: [1, 2, 3, 4, 6] 
7

Đây là tên tạm thời được sử dụng trong danh sách hiểu bởi Python 2.6 trở về trước. Python 2.7 và Python 3.x đã sửa lỗi này: danh sách được tạo không còn khả dụng cho đến khi tạo xong.

Hoặc ngắn gọn là chi tiết triển khai mà không ai phải dựa vào.

Ở đây bạn có thể thấy rằng Python 2,7 lá locals() không thay đổi trong khi Python 2.6 tạo ra một live ngắn tạm thời:

Python 2.7.2 (default, Jan 5 2012, 16:24:09) 
[GCC 4.1.2 20080704 (Red Hat 4.1.2-51)] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
>>> def foo(): 
     t = [list(locals().keys()) for x in range(1) ] 
     print(locals()) 
     print(t[0]) 

>>> foo() 
{'x': 0, 't': [['x']]} 
['x'] 
>>> 

Python 2.6.7 (r267:88850, Jan 5 2012, 16:18:48) 
[GCC 4.1.2 20080704 (Red Hat 4.1.2-51)] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
>>> def foo(): 
     t = [list(locals().keys()) for x in range(1) ] 
     print(locals()) 
     print(t[0]) 

>>> foo() 
{'x': 0, 't': [['_[1]', 'x']]} 
['_[1]', 'x'] 
>>> 

Python 3.x giới thiệu một đoạn ngắn mới tạm danh sách comprehensions sống gọi .0. Đừng bị cám dỗ để sử dụng nó cho bất cứ điều gì. Ngoài ra, toàn bộ danh sách hiểu được chạy trong một không gian tên riêng biệt nên các biến vòng lặp không thể truy cập được ngoài vòng lặp:

Python 3.2 (r32:88445, Jan 5 2012, 16:29:57) 
[GCC 4.1.2 20080704 (Red Hat 4.1.2-51)] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
>>> def foo(): 
     t = [list(locals().keys()) for x in range(1) ] 
     print(locals()) 
     print(t[0]) 

>>> foo() 
{'t': [['.0', 'x']]} 
['.0', 'x'] 
3

Wow! Đó là mã khó hiểu. Mất một chút nghiên cứu để tìm câu trả lời.

Về cơ bản, việc hiểu danh sách đang tạo danh sách mới. Tên này có tên là danh sách tạm thời _[1]. Phần locals() chỉ sử dụng từ điển locals() để tra cứu tên đó, vì nó không thể truy cập được bằng cách khác. Vì vậy, dòng đó đang nói ...

[x for x in seq if x not in this_list] 

Bí ẩn.

cho thấy thông tin về vấn đề này here

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