2012-07-09 14 views
18

Czy występują nieprzewidziane problemy z mieszaniem różnych typów na liście w języku Python? Na przykład:Czy mogę bezpiecznie mieszać typy na liście Pythona?

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

Używam tego kodu do losowo ustawić kilka parametrów związanych z wewnątrz funkcji, ale mimo Python obsługuje go, jestem ostrożny mieszania typów jak ten na liście. Ponieważ lista mieszanych typów danych nie będzie użyta do żadnego przetwarzania poza samym przypisaniem zmiennych (zmienne, które przypisuje do woli, ale nie do samej listy), zakładam, że to jest w porządku, ale chcę się upewnić, że nie jest potajemnie problematycznym kodem.

+1

Technicznie element tablicy _jest_ wszystkie tego samego typu - odniesienia (do obiektów) –

+0

@gnibbler Dobra uwaga. –

Odpowiedz

24

Nie, nie ma problemu, możesz przechowywać dowolny typ wewnątrz list inaczej niż w "dawnych czasach", gdy inne języki miały tablice, które chciały tylko jednego typu danych w nich przechowywanych.

Ponieważ listy mogą również przechowywać inną listę i inne złożone struktury danych, wraz z innymi odniesieniami do obiektów, przetwarzanie lub iterowanie listy może stać się nieco bardziej złożone z powodu możliwych wielu warstw, niż po prostu przechodzenie przez tablicę w prosta iteracja pojedynczego poziomu. Jest to również związane z shallow and deep copying.

Jeśli kod przetwarzający listę jest tego świadomy, nie mogę wymyślić żadnych problemów z powodu tej zdolności do przechowywania różnych rzeczy na liście.

+0

Dzięki. Wiem, że mogę * przechowywać * dowolny typ danych, ale chciałem się upewnić, że nie pojawiły się żadne problemy, których mogłem uniknąć na wczesnym etapie. –

+3

@RicardoAltamirano Jedynym problemem wynikającym z tego jest to, że listy przetwarzania kodu muszą to uwzględnić, ponieważ listy mogą zawierać same listy lub inne struktury danych. W przeciwnym razie nie mogę myśleć o żadnych problemach z tym. – Levon

+0

Cóż, kod przetwarzający listę "danych" jest tutaj. To nic więcej niż "random.choice", i powinien obsługiwać poprawnie, o ile wiem. –

6

Nie ma problemów związanych z posiadaniem wielu typów danych na liście. Problemy mogą oczywiście pojawić się, jeśli spróbujesz użyć tej listy dla czegoś, co oczekuje, że będzie to ten sam typ. W twoim przykładzie, jeśli to wszystko, co robisz z tym, nie ma możliwości, aby stał się problemem. Możesz jednak rozważyć użycie krotki zamiast listy. Zgodnie z konwencją krotki są używane, gdy skład sekwencji jest ustalony; listy są używane, gdy możesz dodać lub usunąć z sekwencji.

+0

Tak właśnie myślałem, ale ponieważ będę używał tylko danych z listy oddzielnie w ich zmiennych, nie sądziłem, że to zaszkodzi. –

9

Język jest w porządku przy mieszaniu typów na liście, ale powinieneś wiedzieć, że kultura Pythona może na nią nie patrzeć. Krotki są zwykle używane, gdy masz znaną kolekcję typów mieszanych, a różne indeksy mają inną semantykę. Listy są zwykle używane, gdy masz jednolitą sekwencję o różnej długości.

więc dane byłyby bardziej konwencjonalnie reprezentowane:

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

Mówiąc zwięźle: krotki są wykorzystywane jak C kodowanym, list, takich jak macierze C.

+0

A jeśli twoja krotka jest długa lub używa wielu miejsc w kodzie, możesz zamiast tego zdefiniować klasę, abyś mógł nazwać obiekt w każdej jego pozycji. –

Powiązane problemy