У меня есть двойной массив
alist[1][1]=-1
alist2=[]
for x in xrange(10):
alist2.append(alist[x])
alist2[1][1]=15
print alist[1][1]
и я добираюсь 15. Очевидно я передаю указатель, а не фактическую переменную... Существует ли простой способ сделать отдельный двойной массив (никакие общие указатели), не имея необходимость делать двойное для цикла?
Спасибо, Dan
Список списков обычно не является отличным решением для создания 2-мерного массива. Вероятно, вы захотите использовать numpy, который предоставляет очень полезный и эффективный тип n-мерного массива. можно копировать массивы numpy.
Другие решения, которые обычно лучше, чем простой список списков, включают dict с кортежами в качестве ключей ( d [1, 1]
будет компонентом 1, 1) или определение вашего собственного класса 2-мерного массива. . Конечно, dicts можно копировать, и вы можете абстрагироваться от копирования для своего класса.
Чтобы скопировать список списков, вы можете использовать copy.deepcopy
, который перейдет на один уровень при копировании.
Вы можете использовать somelist[:]
, то есть срез типа somelist[1:2]
от начала до конца, для создания (неглубокой) копии списка. Применение этого к вашему циклу for дает:
alist2 = []
for x in xrange(10):
alist2.append(alist[x][:])
Это также можно записать в виде понимания списка:
alist2 = [item[:] for item in alist]
Если вы все равно уже перебираете список, то проще всего просто копировать внутренние списки по мере выполнения, как сказано в ответе seanmonstar.
Если вы просто хотите сделать глубокую копию списка, вы можете вызвать copy.deepcopy()
.
Я думаю, что copy.deepcopy() как раз для этого случая.
Обычно вы можете сделайте что-нибудь вроде:
new_list = old_list[:]
Так что, возможно, вы могли бы добавить это в свой единственный цикл for?
for x in range(10):
alist2.append(alist[x][:])
сделать копию списка при добавлении.
alist2.append(alist[x][:])