В первом случае, docs_dicts_dupl = docs_dicts[:]
создает новое назначение только для дескриптора списка, ie, id
списков будут одинаковыми, и аналогично для членов списка он просто создает ссылки, элементы в списке с одинаковыми позициями будут иметь одинаковые id
s, и вам понадобится copy.deepcopy()
для назначения новых членов. Этот код может развеять ваши сомнения:
a = [1,2,3]
b = a
print('a = ',a)
print('b = ',b)
b[0] = 6
print('a = ',a)
print('b = ',b)
print('id(a) = ',id(a))
print('id(b) = ',id(b))
print('id(a[0]) = ',id(a[0]))
print('id(b[0]) = ',id(b[0]))
c = copy.deepcopy(a)
print('==========================')
print('After Deep copy :')
print('==========================')
print('id(a) = ',id(a))
print('id(c) = ',id(c))
print('id(a[0]) = ',id(a[0]))
print('id(c[0]) = ',id(c[0]))
print('But when you assign something : id changes for a member of c')
c[0] = 123
print('id(c[0]) = ',id(c[0]))
Вывод:
a = [1,2,3]
b = [1,2,3]
a = [6,2,3]
b = [6,2,3]
id(a) = 140081055605184
id(b) = 140081055605184
id(a[0]) = 9743968
id(b[0]) = 9743968
==========================
After Deep copy :
==========================
id(a) = 140081055605184
id(c) = 140081055605888
id(a[0]) = 9743968
id(c[0]) = 9743968
But when you assign something : id changes for a member of c
id(c[0]) = 140081056537264
Обратите внимание, что строки docs_dicts_dupl = docs_dicts[:]
недостаточно для полного копирования списков.