Яка різниця між списками, укладеними квадратними дужками та дужками в Python?


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

Чи обоє вони дійсні? Чи є хтось кращим з якоїсь причини?


3
Просто FYI: є більш глибока різниця між (i for i in ...)та [i for i in ...].
Рік Поггі

2
@RikPoggi У чому полягає глибока різниця? Чи можете ви, будь ласка, докладно?
qazwsx

11
Перший - це вираз генератора, а другий - розуміння списку . Деякі відомості ви можете знайти тут: Офіційний підручник з вивчення списків , PEP 289 . А ось в деяких питаннях ОС: генератор виразів проти Список Розуміння , генератор-розуміння .
Рік Поггі

Відповіді:


275

Квадратні дужки - це списки, а дужки - кортежі .

Список є змінним, тобто ви можете змінити його вміст:

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

а кортежі - не:

>>> 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'

Інша основна відмінність полягає в тому, що кортеж є хешируемим, тобто ви можете використовувати його як ключ до словника, серед іншого. Наприклад:

>>> 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'

Зауважте, що, як багато людей вказали, ви можете додавати кортежі разом. Наприклад:

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

Однак це не означає, що кортежі є змінними . У наведеному вище прикладі новий кортеж будується шляхом додавання двох аргументів як аргументів. Оригінальний кортеж не модифікований. Щоб продемонструвати це, врахуйте наступне:

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

Тоді якби ви створили цей самий приклад зі списком, yвін також буде оновлений:

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

1
хороші, але прості приклади, щоб перелічити відмінності. Дякую!
Доктор Ессен

8

Одна цікава різниця:

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)

Коса повинна бути включена в кортеж, навіть якщо вона містить лише одне значення. наприклад (1,)замість (1).


Дякую. Це те, що я шукав. Код, який я бачив, мав (list1 + list2 + list3), і він повертав список, а не кортеж.
HuckIt

4

Вони не списки, вони - список і кортеж. Про кортежі ви можете прочитати в навчальному посібнику Python. Хоча ви можете мутувати списки, це неможливо з кортежами.

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

Інший спосіб, що дужки і дужки відрізняються, полягає в тому, що квадратні дужки можуть описувати розуміння списку, наприклад [x for x in y]

Тоді як відповідний батьківський синтаксис вказує генератор кортежу :(x for x in y)

Ви можете зрозуміти кортеж, використовуючи: tuple(x for x in y)

Дивіться: Чому в Python немає розуміння кортежу?



2

Елементи, відокремлені комами, додані до (і )є tuples, ті, що додаються до [і ]є lists.


1
Немає списків, які укладені "круглими" дужками, це кортежі! Але ви, мабуть, маєте на увазі правильну річ. :P
Гандаро

1
Списки, додані до (і), є кортежами . Я плутаний, вони списки чи кортежі?
juliomalegria

@ julio.alegria Я думаю, що @FlopCoder мав намір написати " Елементи, додані до (і )є tuples, ті, що додаються [та ]є lists".
funroll
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.