Причина, по которой эти двое ведут себя по-разному, заключается в том, что f()[0:2][0:10]
работает следующим образом:
f()
дает вам список списков.
[0:2]
дает вам список, содержащий первые два элемента в списке списков. Поскольку элементы в списке списков являются списками, это также список списков.
[0:10]
дает вам список, содержащий первые десять элементов в списке списков, который был создан на шаге 2.
Другими словами, f()[0:2][0:10]
начинается со списка списков, затем берет подсписок этого списка списков (который также является списком списков), а затем берет подсписок второго списка списков (который также список списков).
Напротив, f()[i]
фактически извлекает i
-й элемент из вашего списка списков, который является простым списком (не списком списков). Затем, когда вы применяете [0:10]
, вы применяете его к простому списку, полученному из f()[i]
, а не к списку списков.
Суть в том, что любое решение, которое дает желаемое поведение, должно будет в какой-то момент обращаться к одному элементу массива, например [i]
, а не работать только с кусочками, такими как [i:j]
.