Như những người khác đã nói, append
đột biến danh sách riêng của mình và bạn không nên gán nó vào một biến. Thực thi nó thay đổi dữ liệu của nó, cập nhật hiệu quả mọi người chỉ vào nó.
Nhưng, có một mẹo tôi sử dụng khi tôi muốn làm công cụ trong một * cách chức năng trong khi đột biến đối tượng hiện có (chứ không phải là xây dựng những cái mới, trong trường hợp này sử dụng a=[x + ['a'] for x in a]
, hay đặc biệt là x + ['a']
).
Vì vậy, nếu bạn đang dũng cảm đủ bạn cũng có thể làm điều này:
>>> a=[[1,2],[3,4],[5,6]]
>>> a=[x.append('a') or x for x in a]
>>> a
[[1, 2, 'a'], [3, 4, 'a'], [5, 6, 'a']]
này hoạt động vì lợi nhuận append
None
và or
tiếp tục trên để tìm kiếm một giá trị thật-y, mà x
là (đó là list
với ít nhất những gì được thêm vào nó).
Tại sao tôi thậm chí cần điều này?
Giả sử bạn có một danh sách và bạn muốn chèn một số thành viên của nó vào một danh sách mới, và cập nhật các tài liệu tham khảo phù hợp:
Vì vậy, bạn có danh sách all
:
>>> all = [[], [], [], []]
Một số nó được chèn vào và cập nhật vào một danh sách mới x
:
>>> x = [i.append('x') or i for i in all[:2]]
>>> x
[['x'], ['x']]
một số all
cũng được chèn vào và u pdated vào một danh sách y
:
>>> y = [i.append('y') or i for i in all[1:3]]
all
được cập nhật:
>>> all
[['x'], ['x', 'y'], ['y'], []]
Nhưng x
cũng được cập nhật:
>>> x
[['x'], ['x', 'y']]
Và y
được tạo ra như mong đợi:
>>> y
[['x', 'y'], ['y']]
Nhìn chung, đối với các tác vụ đơn giản, tôi khuyên bạn nên sử dụng vòng lặp for
cập nhật một cách rõ ràng. Đây là những gì được coi là pythonic.
Về mặt kỹ thuật, nếu bạn có quyền truy cập vào các lớp danh sách, bạn có thể làm điều này một chức năng:
def more_functional_append(self, x):
self.append(x)
return self
- functional programming được dựa trên tất cả các tuyên bố làm cơ bản một điều, và không có tác dụng phụ (như vậy , không đột biến và trả lại).
append
không phải là rất chức năng vì nó biến đổi một danh sách (lập trình hàm thuần túy chỉ có các đối tượng bất biến) và không trả lại kết quả để chuyển cho các hành động khác (hàm). Sử dụng các khái niệm lập trình chức năng, bạn có thể tạo ra một lớp lớn tuyệt vời mà không ai có thể đọc được, còn được gọi là "bảo mật công việc" hoặc "mã xấu".
Đó phải là a1 = [danh sách phụ + ['a'] cho danh sách phụ trong a]. Lưu ý các dấu ngoặc xung quanh 'a'. –
Rất tiếc. Đã sửa. Cảm ơn. – Oddthinking