Tạo danh sách các mục duy nhất lặp lại n lần trong Python
Vật phẩm bất biến
Đối với các mặt hàng bất biến, như Không có, bools, ints, float, chuỗi, tuples hoặc fro chục, bạn có thể làm như thế này:
[e] * 4
Lưu ý rằng điều này tốt nhất chỉ được sử dụng với các mục không thay đổi (chuỗi, tuples, fro chục,) trong danh sách, bởi vì tất cả chúng đều trỏ đến cùng một mục trong cùng một vị trí trong bộ nhớ. Tôi sử dụng điều này thường xuyên khi tôi phải xây dựng một bảng với một lược đồ gồm tất cả các chuỗi, do đó tôi không phải đưa ra một bản đồ dự phòng cao cho một ánh xạ.
schema = ['string'] * len(columns)
Vật phẩm có thể thay đổi
Tôi đã sử dụng Python từ lâu và tôi chưa bao giờ thấy trường hợp sử dụng nào mà tôi sẽ làm như trên với một ví dụ có thể thay đổi. Thay vào đó, để có được, giả sử, một danh sách trống có thể thay đổi, thiết lập hoặc đọc chính tả, bạn nên làm một cái gì đó như thế này:
list_of_lists = [[] for _ in columns]
Gạch dưới chỉ đơn giản là một tên biến ném trong bối cảnh này.
Nếu bạn chỉ có số, đó sẽ là:
list_of_lists = [[] for _ in range(4)]
Điều _
này không thực sự đặc biệt, nhưng trình kiểm tra kiểu môi trường mã hóa của bạn có thể sẽ phàn nàn nếu bạn không có ý định sử dụng biến và sử dụng bất kỳ tên nào khác.
Hãy cẩn thận khi sử dụng phương pháp bất biến với các vật phẩm có thể thay đổi:
Coi chừng làm điều này với các đối tượng có thể thay đổi , khi bạn thay đổi một trong số chúng, tất cả chúng đều thay đổi vì tất cả chúng đều là cùng một đối tượng:
foo = [[]] * 4
foo[0].append('x')
foo bây giờ trở lại:
[['x'], ['x'], ['x'], ['x']]
Nhưng với các đối tượng bất biến, bạn có thể làm cho nó hoạt động vì bạn thay đổi tham chiếu, không phải đối tượng:
>>> l = [0] * 4
>>> l[0] += 1
>>> l
[1, 0, 0, 0]
>>> l = [frozenset()] * 4
>>> l[0] |= set('abc')
>>> l
[frozenset(['a', 'c', 'b']), frozenset([]), frozenset([]), frozenset([])]
Nhưng một lần nữa, các đối tượng có thể thay đổi là không tốt cho điều này, bởi vì các hoạt động tại chỗ thay đổi đối tượng, không phải là tham chiếu:
l = [set()] * 4
>>> l[0] |= set('abc')
>>> l
[set(['a', 'c', 'b']), set(['a', 'c', 'b']), set(['a', 'c', 'b']), set(['a', 'c', 'b'])]