2.7. Danh sách (List)¶
Một danh sách là một chuỗi giá trị có thể thay đổi, có thứ tự. Không giống như chuỗi và bytes, danh sách có thể chứa giá trị của bất kỳ kiểu nào, và bạn có thể thay đổi, thêm, hoặc xóa các mục ngay tại chỗ.
2.7.1. Tạo danh sách¶
Dấu ngoặc vuông tạo một danh sách literal:
empty = []
nums = [1, 2, 3]
mixed = [1, "two", 3.0, True, None] # any types
nested = [[1, 2], [3, 4], [5, 6]] # lists of lists
Hàm tạo list xây dựng danh sách từ bất kỳ iterable nào:
>>> list("abc")
['a', 'b', 'c']
>>> list(range(5))
[0, 1, 2, 3, 4]
2.7.2. Độ dài, lập chỉ mục và cắt lát¶
len() trả về số lượng mục. Lập chỉ mục và cắt lát hoạt động giống như chuỗi -- vị trí bắt đầu từ 0, chỉ số âm đếm từ cuối, và một lát cắt ngoài phạm vi hợp lệ sẽ được cắt ngầm thay vì gây ra ngoại lệ:
>>> nums = [10, 20, 30, 40, 50]
>>> len(nums)
5
>>> nums[0]
10
>>> nums[-1]
50
>>> nums[1:4]
[20, 30, 40]
Chỉ số dương đếm từ đầu; chỉ số âm đếm từ cuối.¶
Cú pháp lát cắt là viết tắt cho đối tượng slice mà Python xây dựng ngầm. nums[1:4] tương đương với nums[slice(1, 4)]. Bạn hiếm khi tự tạo một cái, nhưng slice() đôi khi hữu ích khi lưu một lát cắt làm giá trị để tái sử dụng:
head = slice(0, 3)
print(nums[head]) # [10, 20, 30]
print(letters[head]) # first three letters, same slice
2.7.3. Thay đổi danh sách¶
Danh sách hỗ trợ gán giá trị theo chỉ mục và theo lát cắt ngay tại chỗ:
>>> nums = [10, 20, 30]
>>> nums[0] = 99
>>> nums
[99, 20, 30]
>>> nums[1:3] = [200, 300, 400] # slice can change the length
>>> nums
[99, 200, 300, 400]
Các phương thức danh sách phổ biến nhất:
list.append()-- thêm một mục vào cuối.list.extend()-- nối thêm mọi mục từ một iterable.list.insert()-- chèn vào một vị trí cụ thể.list.remove()-- xóa lần xuất hiện đầu tiên của một giá trị.list.pop()-- xóa và trả về một mục (mục cuối mặc định).list.clear()-- xóa tất cả các mục.list.sort()-- sắp xếp tại chỗ. Truyềnreverse=Trueđể sắp xếp giảm dần.list.reverse()-- đảo ngược tại chỗ.
>>> nums = []
>>> nums.append(1)
>>> nums.extend([2, 3])
>>> nums.insert(0, 99)
>>> nums
[99, 1, 2, 3]
>>> nums.pop()
3
>>> nums.sort()
>>> nums
[1, 2, 99]
Các phương thức này thay đổi danh sách tại chỗ và trả về None. Viết
nums = nums.sort() # nums is now None -- common bug
hầu như không bao giờ là điều bạn muốn; nums gốc đã được sắp xếp, nhưng câu lệnh gán sau đó ghi đè tên bằng giá trị trả về. Hãy gọi nums.sort() trên dòng riêng của nó, hoặc dùng hàm tích hợp sorted() để nhận danh sách đã sắp xếp mới mà không làm thay đổi bản gốc.
2.7.4. Các toán tử¶
+nối hai danh sách thành một danh sách mới.*lặp lại một danh sách.inkiểm tra sự tồn tại của phần tử.
>>> [1, 2] + [3, 4]
[1, 2, 3, 4]
>>> [0] * 5
[0, 0, 0, 0, 0]
>>> 3 in [1, 2, 3]
True
2.7.5. Lặp qua danh sách¶
Vòng lặp for duyệt qua các mục theo thứ tự:
for n in [10, 20, 30]:
print(n)
2.7.6. Đặt bí danh và thay đổi¶
Một danh sách là một giá trị duy nhất trong bộ nhớ; nhiều tên có thể trỏ đến cùng một danh sách. Thay đổi thông qua một tên có thể thấy qua mọi tên khác trỏ đến cùng danh sách đó.
a và b đều trỏ đến cùng một danh sách. Thay đổi qua bất kỳ tên nào cũng ảnh hưởng đến những gì mọi tên khác thấy.¶
>>> a = [1, 2, 3]
>>> b = a
>>> a.append(4)
>>> b
[1, 2, 3, 4] # same object, change is visible
Để tạo một bản sao độc lập, cắt toàn bộ danh sách hoặc gọi hàm tạo list:
>>> c = a[:] # or list(a)
>>> a.append(5)
>>> c
[1, 2, 3, 4] # c is unaffected
Điều này chỉ sao chép danh sách cấp trên cùng; các danh sách lồng nhau vẫn được chia sẻ giữa bản gốc và bản sao.