2012-01-01 7 views
10

Thông thường, việc hiểu danh sách được sử dụng để lấy danh sách mới từ danh sách hiện có. Ví dụ:sử dụng đúng danh sách hiểu - python

>>> a = [1, 2, 3, 4, 5] 
>>> [i for i in a if i > 2] 
[3, 4, 5] 

Chúng ta có nên sử dụng chúng để thực hiện các thủ tục khác không? Ví dụ:

>>> a = [1, 2, 3, 4, 5] 
>>> b = [] 
>>> [b.append(i) for i in a] 
[None, None, None, None, None] 
>>> print b 
[1, 2, 3, 4, 5] 

hay tôi nên tránh ở trên và sử dụng sau đây thay vì ?:

for i in a: 
    b.append(i) 

Trả lời

10

Bạn thực sự nên tránh sử dụng comprehensions danh sách (cùng với comprehensions từ điển, thiết comprehensions và biểu thức máy phát) cho các tác dụng phụ. Ngoài thực tế là họ sẽ tích lũy một danh sách không có thật và do đó lãng phí bộ nhớ, nó cũng gây nhầm lẫn. Tôi mong đợi một danh sách hiểu để tạo ra một giá trị (có ý nghĩa), và nhiều người sẽ đồng ý. Các vòng lặp, mặt khác, rõ ràng là một chuỗi các câu lệnh. Họ dự kiến ​​sẽ bắt đầu tác dụng phụ và tạo ra không có giá trị kết quả - không có gì ngạc nhiên.

2

Trong ví dụ bạn đưa ra nó sẽ làm cho ý nghĩa nhất để làm:

b = [i for i in a] 

nếu vì lý do nào đó bạn muốn tạo b. Nói chung, có một số cảm giác thông thường phải được sử dụng. Nếu sử dụng một sự hiểu biết làm cho mã của bạn không đọc được, không sử dụng nó. Nếu không thì hãy đi.

+1

'b = a [:]' cũng sẽ hoạt động ... –

2

Chỉ sử dụng tính năng hiểu danh sách nếu bạn dự định sử dụng danh sách được tạo. Nếu không, bạn tạo ra nó chỉ cho GC để ném nó một lần nữa mà không bao giờ được sử dụng.

Vì vậy, thay vì [b.append(i) for i in a] bạn nên sử dụng một thích hợp cho vòng lặp:

for i in a: 
    b.append(i) 

Một giải pháp sẽ được thông qua một biểu thức máy phát điện:

b += (i for i in a) 

Tuy nhiên, nếu bạn muốn thêm các toàn bộ danh sách, bạn có thể chỉ cần làm

b += a 

Và nếu bạn chỉ cần áp dụng một chức năng để các yếu tố trước khi thêm chúng vào danh sách, bạn luôn có thể sử dụng map:

b += map(somefunc, a) 
+0

Tôi tin rằng bạn đang tập trung quá nhiều vào ví dụ (thực sự khá tệ). – delnan

+0

Vâng câu hỏi chính được trả lời ngay từ đầu - những thứ về ví dụ này chỉ là cung cấp cho người dùng một số ý tưởng về các lựa chọn thay thế. – ThiefMaster

0
b = [] 
a = [1, 2, 3, 4, 5] 
b.extend (a)