2014-07-20 39 views
6

Tôi cảm thấy như thế này phải được hỏi trước (có thể nhiều hơn một lần), vì vậy xin lỗi trước, nhưng tôi không thể tìm thấy nó ở bất cứ đâu (tại đây hoặc thông qua Google). Dù sao, khi giải thích sự khác biệt giữa các danh sách và tuples trong Python, điều thứ hai được đề cập, sau khi bộ dữ liệu không thay đổi, là danh sách tốt nhất cho dữ liệu đồng nhất và bộ dữ liệu là tốt nhất cho dữ liệu không đồng nhất. Nhưng không ai có vẻ nghĩ giải thích lý do tại sao đó là trường hợp. Vậy tại sao lại như vậy?Danh sách dành cho dữ liệu đồng nhất và bộ dữ liệu dành cho dữ liệu không đồng nhất ... tại sao?

Trả lời

4

Sự khác biệt là triết học nhiều hơn bất kỳ thứ gì.

Tuple có nghĩa là viết tắt cho cố định và ý nghĩa dữ liệu được xác định trước. Ví dụ:

person = ("John", "Doe") 

Vì vậy, ví dụ này là người có tên và họ. Các cố định bản chất của điều này là yếu tố quan trọng. Không phải kiểu dữ liệu. Cả "John" và "Doe" đều là các chuỗi, nhưng đó không phải là vấn đề. Lợi ích của việc này là bản chất không thể thay đổi:

  1. Bạn sẽ không bao giờ ngạc nhiên khi tìm thấy giá trị bị thiếu. người đó luôn có hai giá trị. Luôn luôn.

  2. Bạn sẽ không bao giờ ngạc nhiên khi tìm thấy thứ gì đó được thêm vào. Không giống như một cuốn từ điển, một chút mã không thể "thêm một khóa mới" hoặc thuộc tính

khả năng dự báo này được gọi là immutability Nó chỉ là một cách ưa thích của nói rằng nó có một cấu trúc cố định.

Một trong những lợi ích trực tiếp là nó có thể được sử dụng làm khóa từ điển. Vì vậy:

some_dict = {person: "blah blah"} 

hoạt động. Nhưng:

da_list = ["Larry", "Smith"] 
some_dict = {da_list: "blah blah"} 

không hoạt động.

Đừng để thực tế là tham chiếu phần tử là tương tự (người [0] so với da_list [0]) ném bạn đi. person [0] là tên đầu tiên. da_list [0] chỉ đơn giản là mục đầu tiên trong danh sách tại thời điểm này.

0

Danh sách thường được sử dụng để lặp qua chúng và thực hiện cùng thao tác với mọi phần tử trong danh sách. Rất nhiều hoạt động danh sách dựa trên đó. Vì lý do đó, tốt nhất nên có mọi phần tử là cùng một loại, vì sợ rằng bạn có ngoại lệ vì một mục không đúng.

Tuples là dữ liệu có cấu trúc hơn; chúng không thay đổi nên nếu bạn xử lý chúng một cách chính xác, bạn sẽ không gặp lỗi loại. Đó là cấu trúc dữ liệu bạn sẽ sử dụng nếu bạn đặc biệt muốn kết hợp nhiều loại (như một số struct đang hoạt động).

13

Trước hết, hướng dẫn đó chỉ là sự thật. Bạn được tự do sử dụng bộ dữ liệu cho dữ liệu đồng nhất và danh sách cho dữ liệu không đồng nhất, và có thể có trường hợp đó là điều tốt để làm. Một trường hợp quan trọng là nếu bạn cần bộ sưu tập vào hàm băm để bạn có thể sử dụng nó làm khóa từ điển; trong trường hợp này, bạn phải sử dụng một bộ tuple, ngay cả khi tất cả các phần tử đều đồng nhất trong tự nhiên.

Cũng lưu ý rằng sự khác biệt đồng nhất/dị thể thực sự là về ngữ nghĩa của dữ liệu, không chỉ các loại. Một chuỗi tên, nghề nghiệp và địa chỉ có thể được coi là không đồng nhất, mặc dù cả ba có thể được biểu diễn dưới dạng chuỗi. Vì vậy, điều quan trọng hơn là phải suy nghĩ về những gì bạn sẽ làm với dữ liệu (tức là, bạn sẽ thực sự đối xử với các yếu tố giống nhau) hơn là loại chúng là gì.

Điều đó nói rằng, tôi nghĩ rằng một danh sách lý do được ưu tiên cho dữ liệu đồng nhất là vì chúng có thể thay đổi. Nếu bạn có một danh sách nhiều thứ cùng loại, bạn có thể thêm một số khác vào danh sách, hoặc lấy một thứ; khi bạn làm điều đó, bạn vẫn còn lại với một danh sách những thứ cùng loại. Ngược lại, nếu bạn có một bộ sưu tập các thứ không đồng nhất, thường là do bạn có một cấu trúc cố định hoặc "lược đồ" cho chúng (ví dụ, cái đầu tiên là số ID, thứ hai là tên, thứ ba là một địa chỉ, hoặc bất cứ điều gì). Trong trường hợp này, sẽ không có ý nghĩa gì khi thêm hoặc xóa một phần tử khỏi bộ sưu tập, bởi vì bộ sưu tập là toàn bộ được tích hợp với các vai trò được chỉ định cho mỗi phần tử. Bạn không thể thêm phần tử mà không thay đổi toàn bộ lược đồ của mình cho những yếu tố đại diện.

Tóm lại, những thay đổi về kích thước sẽ tự nhiên hơn đối với các bộ sưu tập đồng nhất so với các bộ sưu tập dị thể, do đó các loại có thể thay đổi sẽ tự nhiên hơn đối với các bộ sưu tập đồng nhất.

3

Đó không phải là quy tắc, nó chỉ là một truyền thống.

Trong nhiều ngôn ngữ, danh sách phải đồng nhất và bộ dữ liệu phải có độ dài cố định. Điều này đúng với C++, C#, Haskell, Rust, vv Các bộ dữ liệu được sử dụng làm cấu trúc ẩn danh. Nó là cùng một cách trong toán học. Tuy nhiên,

Hệ thống kiểu của Python không cho phép bạn tạo ra những khác biệt này: bạn có thể tạo các bộ dữ liệu có độ dài động và bạn có thể tạo danh sách với dữ liệu không đồng nhất. Vì vậy, bạn được phép làm bất cứ điều gì bạn muốn với danh sách và tuples trong Python, nó chỉ có thể gây ngạc nhiên cho những người khác đọc mã của bạn.Điều này đặc biệt đúng nếu những người đọc mã của bạn có nền tảng về toán học hoặc quen thuộc hơn với các ngôn ngữ khác.

+0

Tôi biết điều này là cũ, nhưng tôi bắt đầu đọc toàn bộ chủ đề và bạn ' "bạn có thể làm cho các bộ chiều dài năng động"' chỉ dừng lại cho tôi ngay tại đó ... là thực tế? Tôi đã chắc chắn 100% tuples là kích thước cố định, nhưng với danh tiếng của bạn, tôi đoán bạn phải thực sự biết tốt hơn ... bạn có thể xây dựng? – Silmathoron

+0

@Silmathoron: Có chức năng 'tuple', bạn có thể chuyển vào danh sách tuy nhiên bạn muốn. Điều này là không thể, ví dụ: C++, Haskell… –

+0

Phải ... bằng cách sử dụng 'chiều dài động' có vẻ hơi khó hiểu, vì nó dường như ngụ ý (ít nhất là với tôi) rằng chiều dài của bộ tuple có thể thay đổi ... nhưng hàm 'tuple' thực sự không tương đương với C++ – Silmathoron

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