2012-07-09 26 views
18

Có những vấn đề không lường trước được khi trộn các loại khác nhau trong danh sách Python không? Ví dụ:Tôi có phải là loại trộn an toàn trong danh sách Python không?

import random 
data = [["name1", "long name1", 1, 2, 3], 
     ["name2", "long name2", 5, 6, 7]] 
name, long_name, int1, int2, int3 = random.choice(data) 

Tôi đang sử dụng mã này để thiết lập một cách ngẫu nhiên một vài thông số liên quan trong phạm vi chức năng, nhưng mặc dù Python hỗ trợ nó, tôi cảnh giác với loại trộn như thế này trong một danh sách. Vì danh sách các kiểu dữ liệu hỗn hợp sẽ không được sử dụng cho bất kỳ quá trình xử lý nào ngoài việc gán biến trong và của chính nó (các biến nó gán cho ý chí, nhưng không phải danh sách), tôi cho rằng điều này là tốt, nhưng tôi muốn đảm bảo điều này không phải là mã có vấn đề bí mật.

+1

Phần tử mảng kỹ thuật _are_ tất cả cùng loại - tham chiếu (đối tượng) –

+0

@gnibbler Điểm tốt. –

Trả lời

24

Không, không có vấn đề gì, bạn có thể lưu trữ bất kỳ loại nào bên trong list không giống như trong "ngày cũ" khi các ngôn ngữ khác có mảng chỉ muốn một loại dữ liệu được lưu trữ trong đó.

Vì danh sách cũng có thể lưu trữ danh sách khác và cấu trúc dữ liệu kết hợp khác, cùng với các tham chiếu đối tượng khác, xử lý hoặc lặp qua danh sách có thể phức tạp hơn một chút do nhiều lớp có thể đơn giản cấp độ lặp lại. Điều này cũng liên quan đến shallow and deep copying.

Nếu mã xử lý danh sách nhận thức được điều này, tôi không thể nghĩ ra bất kỳ sự cố nào do khả năng lưu trữ những thứ khác nhau trong danh sách.

+0

Cảm ơn. Tôi biết tôi * có thể * lưu trữ bất kỳ loại dữ liệu nào, nhưng tôi muốn đảm bảo rằng không có vấn đề nào thể hiện bản thân mà tôi có thể đơn giản tránh sớm. –

+3

@RicardoAltamirano vấn đề duy nhất phát sinh từ việc này là danh sách xử lý mã cần tính đến điều này vì danh sách có thể chứa danh sách hoặc cấu trúc dữ liệu khác. Nếu không, tôi không thể nghĩ ra bất kỳ vấn đề nào với điều này. – Levon

+0

Vâng, mã xử lý danh sách 'dữ liệu' là tất cả ở đó. Nó không có gì hơn 'random.choice', và nó sẽ xử lý đúng như tôi biết. –

6

Không có vấn đề cố hữu trong việc có nhiều loại dữ liệu trong danh sách. Tất nhiên, vấn đề có thể xảy ra nếu bạn cố gắng sử dụng danh sách đó cho một cái gì đó mà hy vọng nó sẽ được tất cả cùng loại. Trong ví dụ của bạn, nếu đây là tất cả những gì bạn đang làm với nó, không có cách nào để nó trở thành một vấn đề. Bạn có thể xem xét, mặc dù, bằng cách sử dụng một tuple thay vì một danh sách. Theo quy ước, các bộ dữ liệu được sử dụng khi thành phần của chuỗi được cố định; danh sách được sử dụng khi bạn có thể thêm vào hoặc xóa khỏi chuỗi.

+0

Đó là những gì tôi nghĩ, nhưng vì tôi sẽ chỉ sử dụng dữ liệu trong danh sách riêng biệt trong các biến tương ứng, tôi không nghĩ nó sẽ gây hại. –

9

Ngôn ngữ là tốt khi bạn trộn các loại trong danh sách, nhưng bạn nên biết rằng văn hóa Python có thể cau mày trên đó. Tuple thường được sử dụng khi bạn có một bộ sưu tập các loại hỗn hợp đã biết và các chỉ mục khác nhau có ngữ nghĩa khác nhau. Danh sách thường được sử dụng khi bạn có một chuỗi đồng đều có độ dài khác nhau.

Vì vậy, dữ liệu của bạn sẽ thông thường hơn được biểu diễn như:

data = [ 
    ("name1", "long name1", 1, 2, 3), 
    ("name2", "long name2", 5, 6, 7), 
    ... 
] 

Nói một cách ngắn gọn hơn: tuples được sử dụng như struct C, danh sách như mảng C.

+0

Và nếu tuple của bạn dài hoặc được sử dụng nhiều nơi trong mã của bạn, bạn có thể muốn xác định một lớp thay vào đó, vì vậy bạn có thể đặt tên đối tượng ở mỗi vị trí bên trong nó. –

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