Назначение против добавления в вложенных списках Python
Я потратил полдня на поиски ошибки, которая сводится к следующему поведению присвоения вложенного списка (контраст list_append против list_assign):
list_append = []
list_assign = [ [None]*3 ]*4
for iseg1 in range(4):
list_run = []
for iseg2 in range(3):
list_run.append(10*iseg1+iseg2)
list_assign[iseg1][iseg2] = 10*iseg1+iseg2
list_append.append(list_run)
print list_append
print list_assign
Когда этот фрагмент выполняется, вывод:
[[0, 1, 2], [10, 11, 12], [20, 21, 22], [30, 31, 32]]
[[30, 31, 32], [30, 31, 32], [30, 31, 32], [30, 31, 32]]
в то время как я ожидал бы первого результата в обоих случаях.
Я предполагаю, что это побочный эффект *
оператор в list_assign = [ [None]*3 ]*4
, но даже в этом случае это странно, потому что это относится только к одному измерению во вложенном списке.
Это ожидается? Это ошибка? Это специфично для Python 2.7? Должен ли я использовать массивы numpy или какой-то другой стандартный способ избежать пути list_append, который является более неуклюжим и, возможно, менее эффективным?
PS: для тех, кто интересуется цветом фона, вложенный список, который я строил, на самом деле был списком функций, поэтому я потратил много времени, пытаясь понять, была ли проблема на уровне областей действия переменных в функции def; следовательно, несколько часов потеряно