В чем разница между списками, заключенными в квадратные скобки и скобки в Python?


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

Они оба действительны? Один предпочтителен по какой-то причине?


3
Просто к вашему сведению: есть более глубокая разница между (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
Списки, заключенные в (и), являются кортежами . Я запутался, это списки или кортежи?
Юлиомалегрия

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