2012-04-02 28 views
7

Tôi đã biết trong một thời gian rằng sự khác biệt chính giữa các danh sách và tuples trong Python là danh sách có thể thay đổi và không phải là bộ tuples. Ngoài ra và các phương pháp khác nhau có sẵn cho họ, tôi biết rất ít về danh sách và bộ dữ liệu. Có sự khác biệt nào khác giữa chúng không? Có bất kỳ lợi thế/bất lợi nào của (ngoài sự bất biến) trong việc sử dụng một bộ dữ liệu trên danh sách trong Python 3 không? Có ai có thời gian truy cập nhanh hơn hoặc có kích thước bộ nhớ nhỏ hơn hoặc chứa nhiều phương pháp hơn phương pháp kia không? Cấu trúc bên trong của chúng có khác nhau theo bất kỳ cách nào không? Hay là một tuple chỉ là một danh sách bất biến, không gì hơn?Sự khác biệt giữa danh sách và tuple (trừ bất biến) trong Python?

+0

có thể trùng lặp của [Sự khác nhau giữa danh sách và bộ dữ liệu là gì?] (Http://stackoverflow.com/questions/626759/whats-the-difference-between-list-and-tuples) –

Trả lời

7

Cả hai danh sách và bộ dữ liệu được triển khai nội bộ dưới dạng mảng tham chiếu đến đối tượng phần tử. Bằng cách này, cả hai có thể được lập chỉ mục và cả hai đều yêu cầu cùng một lượng bộ nhớ cho mỗi phần tử. Bên trong, chúng đều đồng nhất (tham chiếu không được phân loại). Về mặt logic, chúng đều không đồng nhất (dereferencing tự động, loại được ràng buộc với đối tượng đích).

Danh sách có thể được sửa đổi, do đó mảng nội bộ là một mảng động. Không thể sửa đổi bộ tuple, vì vậy nó chỉ là mảng kích thước cố định. Từ quan điểm đó, các bộ dữ liệu đơn giản hơn.

Nếu nhanh hơn hay không, bạn có thể đo tình hình cụ thể bằng mô-đun timeit.

Bạn nên biết thực tế rằng bộ dữ liệu không thay đổi chỉ đối với số và giá trị của các tham chiếu được lưu trữ. Nếu (nói) một danh sách được sử dụng như một trong các phần tử tuple, nội dung danh sách có thể được thay đổi. Bằng cách này, một cách hợp lý, nội dung của tuple không phải là hằng số (tuple đó không phải là hashable).

Sử dụng bất kỳ loại nào tốt hơn cho mục đích này. Không có ưu tiên nghiêm ngặt. Nó phụ thuộc vào tình hình.

4

Chạy thư mục trên cả hai danh sách - danh sách phương pháp khá khác (pop được minh họa bên dưới). tuples có thể nhanh hơn

>>> alist = [1,2,3] 
>>> atuple = (1,2,3) 
>>> alist.pop() 
3 
>>> atuple.pop() 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
AttributeError: 'tuple' object has no attribute 'pop' 

'append', 'đếm', 'mở rộng', 'index', 'chèn', 'pop', 'xóa', 'đảo ngược', 'sắp xếp' là tất cả sẵn sàng cho các danh sách và không dành cho các bộ dữ liệu - có ý nghĩa, với ý tưởng bất biến.

Về mặt triết học, một số người mong đợi danh sách là đồng nhất và không có kỳ vọng về bộ dữ liệu đó.

+0

Có bất kỳ sự khác biệt nội bộ nào trong các loại, chẳng hạn như strucure hoặc mã hóa? – fouric

+0

Nếu bạn có nghĩa là mã hóa chuỗi sau đó nó không liên quan đến tuples. Việc mã hóa chỉ là một cách để chuyển đổi chuỗi trừu tượng thành chuỗi byte cụ thể. Khi tuple chứa một phần tử chuỗi, đối tượng chuỗi được tạo bên ngoài tuple. Phần tử tuple chỉ đề cập đến đối tượng (tham chiếu untyped). Điều này giống với cả phần tử tuple hoặc phần tử danh sách. – pepr

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