Python - возвращение списка [[...], 6] - программирование
Подтвердить что ты не робот

Python - возвращение списка [[...], 6]

Если я запускаю следующий код

data = [[1,2],[3,4],[5,6]]

for x in data:
    print(x[0])

for x[0] in data:
    print(x)

Я получаю следующий вывод

1
3
5
[[1, 2], 6]
[[3, 4], 6]
[[...], 6]

Я получаю список, содержащий [[...], 6], но что это за список [...]?

Это не ведет себя нормально, потому что вызов y = [[...], 6] а затем следующие операторы показывают [...] чтобы быть 0

>>> print(y)
[[Ellipsis], 6]

>>> print(y[0])
[0]

Однако когда я запускаю код сверху и печатаю следующие операторы, результаты не имеют смысла:

>>> print(x)
[[...], 6]

>>> print(x[0])
[[...], 6]

>>> print(x[0][0])
[[...], 6]

>>> print(x[0][0][0])
[[...], 6]

и все же так или иначе оба из них приводят к 6

>>> print(x[1])
6

>>> print(x[0][1])
6

Рассмотрим вопрос: как это возможно и что [...] представляет, и как цикл for в верхней части может создать такой список?

4b9b3361

Ответ 1

Позвольте дать вашим подспискам имена:

a = [1, 2]
b = [3, 4]
c = [5, 6]
data = [a, b, c]

Ваш первый цикл связывает a, b и c последовательно с x. Когда цикл заканчивается, вы фактически установили x = c.

Второй цикл теперь связывает a, b и c последовательно с x[0]. Это хорошо для a и b, но для c вы эффективно выполняете c[0] = c, создавая циклическую ссылку. Так как list может это перехватить, он не будет пытаться напечатать [[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[...

Ответ 2

это потому, что вы используете x[0] качестве переменной цикла (что является плохой практикой), которая существует в виде списка, а не нового имени, которое вы должны использовать при итерации с for

for x[0] in data:
    print(x)

и x находится в data поэтому существует циклическая ссылка (отсюда и многоточие, чтобы избежать бесконечной рекурсии при печати одних и тех же данных снова и снова)

Подробнее:

Многоточие происходит на последнем элементе из-за предыдущего цикла, который связывает x с последним элементом data ([5,6]).

Таким образом, второй цикл присваивает [5,6] x[0] но также и x. Один из способов избавиться от этого - создать копию x перед вторым циклом: x = x[:]