Назначение против добавления в вложенных списках 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; следовательно, несколько часов потеряно

0 ответов

Другие вопросы по тегам