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 в верхней части может создать такой список?
Ответы
Ответ 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[:]