Jaka jest różnica między listami ujętymi w nawiasy kwadratowe i nawiasy w Pythonie?


174
>>> x=[1,2]
>>> x[1]
2
>>> x=(1,2)
>>> x[1]
2

Czy oba są ważne? Czy z jakiegoś powodu jest to preferowane?


3
Do Twojej wiadomości: istnieje głębsza różnica między (i for i in ...)a [i for i in ...].
Rik Poggi

2
@RikPoggi Jaka jest zasadnicza różnica? Czy mógłbyś to rozwinąć?
qazwsx

11
Pierwsza to wyrażenie generujące, a druga to rozumienie listy . Możesz znaleźć kilka informacji tutaj: Oficjalny samouczek dotyczący rozumienia list , PEP 289 . I tu w niektórych pytaniach OS: Generator wyrażeń vs. listowych , generator zrozumieniem .
Rik Poggi

Odpowiedzi:


275

Nawiasy kwadratowe to listy, a nawiasy to krotki .

Lista jest zmienna, co oznacza, że ​​możesz zmieniać jej zawartość:

>>> x = [1,2]
>>> x.append(3)
>>> x
[1, 2, 3]

podczas gdy krotki nie są:

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

Inną główną różnicą jest to, że krotkę można mieszać, co oznacza, że ​​można jej używać między innymi jako klucza do słownika. Na przykład:

>>> x = (1,2)
>>> y = [1,2]
>>> z = {}
>>> z[x] = 3
>>> z
{(1, 2): 3}
>>> z[y] = 4
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'list'

Zauważ, że jak zauważyło wiele osób, możesz dodać razem krotki. Na przykład:

>>> x = (1,2)
>>> x += (3,)
>>> x
(1, 2, 3)

Nie oznacza to jednak, że krotki są zmienne . W powyższym przykładzie nowa krotka jest konstruowana przez dodanie dwóch krotek jako argumentów. Oryginalna krotka nie jest modyfikowana. Aby to zademonstrować, rozważ następujące kwestie:

>>> x = (1,2)
>>> y = x
>>> x += (3,)
>>> x
(1, 2, 3)
>>> y
(1, 2)

Zważywszy, że gdybyś skonstruował ten sam przykład z listą, yrównież zostałby zaktualizowany:

>>> x = [1, 2]
>>> y = x
>>> x += [3]
>>> x
[1, 2, 3]
>>> y
[1, 2, 3]

1
dobre, ale proste przykłady, aby wymienić różnice. Dzięki!
Dr. Essen

8

Jedna interesująca różnica:

lst=[1]
print lst          // prints [1]
print type(lst)    // prints <type 'list'>

notATuple=(1)
print notATuple        // prints 1
print type(notATuple)  // prints <type 'int'>
                                         ^^ instead of tuple(expected)

Krotka musi zawierać przecinek, nawet jeśli zawiera tylko jedną wartość. np. (1,)zamiast (1).


Dziękuję Ci. To jest to, czego szukałem. Kod, który widziałem, miał (list1 + list2 + list3) i zwrócił listę, a nie krotkę.
HuckIt

4

To nie są listy, to lista i krotka. O krotkach możesz przeczytać w samouczku Pythona. Chociaż możesz modyfikować listy, nie jest to możliwe w przypadku krotek.

In [1]: x = (1, 2)

In [2]: x[0] = 3
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)

/home/user/<ipython console> in <module>()

TypeError: 'tuple' object does not support item assignment

3

Innym sposobem, w jaki różnią się nawiasy i nawiasy, jest to, że nawiasy kwadratowe mogą opisywać składanie listy, np [x for x in y]

Podczas gdy odpowiednia składnia nawiasów określa generator krotek :(x for x in y)

Zrozumienie krotki można uzyskać za pomocą: tuple(x for x in y)

Zobacz: Dlaczego w Pythonie nie ma rozumienia krotek?



2

Elementy oddzielone przecinkami ujęte w (i )tuples, te ujęte w [i ]lists.


1
Nie ma list ujętych w „okrągłe” nawiasy, są to krotki! Ale prawdopodobnie masz na myśli właściwą rzecz. :P
Gandaro,

1
Listy ujęte w (i) są krotkami … Nie wiem, czy to listy czy krotki?
juliomalegria

@ julio.alegria Myślę, że @FlopCoder miał na myśli napisać „ Elementy zawarte w (i )tuples, te zawarte w [i ]lists”.
funroll
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.