Доброе утро/день/вечер/ночь, Codeforces!
Сегодня я впервые попробовал сдать несколько задач на Python.
Во время написание одной из них, я обнаружил что-то совсем непонятное в поведении вложенных списков:
Пусть нам нужен массив 2 на 2.
Пишем:
a = [[0]*2]*2
print "Before:"
print a
a[0][0] = 1
print "After:"
print a
Получаем:
Before:
[[0, 0], [0, 0]]
After:
[[1, 0], [1, 0]]
Вопрос: почему изменился второй список?
Если написать немного по-другому:
a = [[0]*2]
a.append([0]*2)
print "Before:"
print a
a[0][0] = 1
print "After:"
print a
Получаем:
Before:
[[0, 0], [0, 0]]
After:
[[1, 0], [0, 0]]
Вопрос: в чем разница?
Windows 7, 32-bit, Python 2.7.1
Строка запуска: python solution.py < input.txt
[[0]*n for _ in xrange(m)]
a = [[b[i][j] for j in range (n)] for i in range (m)]
a = [[0 for j in range (n)] for i in range (m)]
Есть ещё функция copy.deepcopy для копирования.
А покопировать можно и так [x[:] for x in a]