Инициализировать несколько списков в Python
a = 2
b = 3
c = 4
x = y = z = [0 for i in xrange(a*b*c)]
Есть ли способ, которым x,y,z могут быть инициализированы в одной строке (потому что я не хочу умножать a, b и c для каждой инициализации списка), как отдельные списки из 0. В приведенном выше примере, если x обновляется, то y и z также обновляются одновременно с теми же изменениями.
2 ответа
Решение
Просто используйте другое понимание и распакуйте его:
x, y, z = [[0 for i in xrange(a*b*c)] for _ in xrange(3)]
Обратите внимание, что [0 for i in xrange(a*b*c)]
эквивалентно простому [0] * a*b*c
,
Рассматривая ваше заявленное намерение, а не требование "одной строки":
a = 2
b = 3
c = 4
x = [0 for i in xrange(a*b*c)]
y = x [:]
z = x [:]
Не уверен, что оптимизатор достаточно умен, чтобы избежать повторного умножения при:
x, y, z = [[0 for i in xrange(a*b*c)] for _ in xrange(3)]
Предположим, что a, b и c являются свойствами, поэтому чтение их будет иметь побочные эффекты. Как оптимизатор мог узнать это на языке с динамической типизацией?