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?

qazwsx
źródło
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]
jterrace
źródło
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).

Saurav Sahu
źródło
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
Gandaro
źródło
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?

xyzzy71
źródło
2

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

0605002
źródło
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