a
- это список, а a[:]
- это новый список со всеми скопированными элементами.
>>> a = [1, 2, 3]
>>> a == a[:]
True
>>> a is a[:]
False
Давайте создадим другой список b = ["a", "b"]
. append
добавляет все, что вы даете, в конец списка. Если вы добавите другой список, ссылка к этому списку будет добавлена и может привести к непредвиденному поведению:
>>> b.append(a)
>>> b
["a", "b", [1, 2, 3]]
>>> a[0] = "c"
>>> b
["a", "b", ["c", 2, 3]]
>>> b[2][1] = 42
>>> a
["c", 42, 3]
>>> a is b[2]
True
Вы можете увидеть, что после добавления a
, если вы измените элемент в a
, он также изменяется в b
. Это потому, что b
имеет только ссылку на a
. Чтобы предотвратить это, вы можете вместо этого сделать b.append(a[:])
. Это скопирует значения в a
, поэтому при изменении значений в a
значения в b
останутся такими же, какими они были при копировании:
>>> b.append(a)
>>> b
["a", "b", [1, 2, 3]]
>>> a[0] = "c"
>>> b
["a", "b", [1, 2, 3]]
>>> b[2][1] = 42
>>> a
["c", 2, 3]
>>> a is b[2]
False
Поэтому в вашем вопросе использование solution[:]
гарантирует, что все, что было добавлено к results
, не изменится, когда solution.append
произойдет на следующей итерации for
l oop.