ans
список не очищается, а скорее состоит из нескольких ссылок на ra
, который является пустым списком, потому что после вставки элементов вы очищаете его с помощью ra.clear()
.
Если вы замените ra.clear()
на ra = []
, вам больше не придется очищать список ra
, а вместо этого вы будете создавать новый объект. Другой способ посмотреть, что .clear()
удаляет элементы из list
, на которые указывает имя ra
, а ans.append(ra)
не защищает ra
от дальнейшей модификации. Вместо этого, выполнив ra = []
, вы убедитесь, что ra
указывает на новый объект.
Более простой пример, иллюстрирующий проблему:
a = [1, 2, 3]
b = a # assign `b` to `a`
print(a)
# [1, 2, 3]
print(b)
# [1, 2, 3]
# we modify `a`
a[0] = 10
print(a)
# [10, 2, 3]
# also `b` gets modified
print(b)
# [10, 2, 3]
c = [a] * 4
print(c)
# [[10, 2, 3], [10, 2, 3], [10, 2, 3], [10, 2, 3]]
a[0] = 1
print(c)
# [[1, 2, 3], [1, 2, 3], [1, 2, 3], [1, 2, 3]]