2011-09-21 35 views
10

Tôi đang cố gắng hiểu cách mở rộng hoạt động trong Python và nó không hoàn toàn làm những gì tôi mong đợi. Ví dụ:Hành vi bất ngờ của việc mở rộng với một danh sách trong Python

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

Nhưng tôi lại có thể ngờ:

[4, 5, 6, 1, 2, 3] 

Tại sao là trả lại một None thay vì mở rộng danh sách?

+5

Bạn mong đợi những gì 'b = [4, 5, 6] + a' thực hiện. –

Trả lời

22

Phương thức extend() nối với mảng hiện có và trả về None. Trong trường hợp của bạn, bạn đang tạo một mảng - [4, 5, 6] - khi đang di chuyển, mở rộng nó và sau đó loại bỏ nó. Biến số b kết thúc bằng giá trị trả về là None.

+0

Cảm ơn, điều đó có ý nghĩa hoàn hảo. – TimothyAWiseman

6

list phương pháp hoạt động tại chỗ cho hầu hết các phần và trả lại None.

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

extend mở rộng toán hạng của nó nhưng không trả lại giá trị. Nếu bạn đã thực hiện:

b = [4, 5, 6] 
b.extend(a) 

Sau đó, bạn sẽ nhận được kết quả mong đợi.

2

Những người khác đã chỉ ra nhiều phương pháp list, đặc biệt là các phương pháp làm thay đổi danh sách, trả lại None thay vì tham chiếu đến danh sách. Lý do họ thực hiện việc này để bạn không bị nhầm lẫn về việc liệu một bản sao của danh sách có được thực hiện hay không. Nếu bạn có thể viết a = b.extend([4, 5, 6]) thì a tham chiếu đến cùng một danh sách là b? Đã được b sửa đổi bởi tuyên bố? Bằng cách trả lại None thay vì danh sách bị đột biến, một tuyên bố như vậy được thực hiện vô ích, bạn nhanh chóng tìm ra rằng a không có trong đó những gì bạn nghĩ nó đã làm, và bạn học cách chỉ viết b.extend(...) thay thế. Do đó sự thiếu rõ ràng bị loại bỏ.

1

Tôi gặp sự cố này và trong khi các câu trả lời khác cung cấp giải thích chính xác, giải pháp/cách giải quyết mà tôi thích không có ở đây. Sử dụng toán tử cộng thêm sẽ nối các danh sách lại với nhau và trả về kết quả. Trong trường hợp của tôi, tôi là sổ sách kế toán color dưới dạng danh sách gồm 3 chữ số và opacity làm phao, nhưng thư viện cần màu như danh sách gồm 4 chữ số có độ mờ là chữ số thứ 4. Tôi không muốn đặt tên một biến throwaway, vì vậy cú pháp này phù hợp với nhu cầu của tôi:

color = [1, 1, 0] 
opacity = 0.75 
plot.setColor(color + [opacity]) 

Điều này tạo ra một danh sách mới cho opacity trên bay và một danh sách mới sau khi nối, nhưng đó là tốt cho mục đích của tôi. Tôi chỉ muốn cú pháp nhỏ gọn để mở rộng một danh sách với một float và trả về danh sách kết quả mà không ảnh hưởng đến danh sách gốc hoặc float.

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