Python: Создайте дубликат массива

У меня есть двойной массив

alist[1][1]=-1
alist2=[]
for x in xrange(10):
    alist2.append(alist[x])
alist2[1][1]=15

print alist[1][1]

и я добираюсь 15. Очевидно я передаю указатель, а не фактическую переменную... Существует ли простой способ сделать отдельный двойной массив (никакие общие указатели), не имея необходимость делать двойное для цикла?

Спасибо, Dan

5
задан Dan 16 March 2010 в 05:47
поделиться

6 ответов

Список списков обычно не является отличным решением для создания 2-мерного массива. Вероятно, вы захотите использовать numpy, который предоставляет очень полезный и эффективный тип n-мерного массива. можно копировать массивы numpy.

Другие решения, которые обычно лучше, чем простой список списков, включают dict с кортежами в качестве ключей ( d [1, 1] будет компонентом 1, 1) или определение вашего собственного класса 2-мерного массива. . Конечно, dicts можно копировать, и вы можете абстрагироваться от копирования для своего класса.

Чтобы скопировать список списков, вы можете использовать copy.deepcopy , который перейдет на один уровень при копировании.

4
ответ дан 18 December 2019 в 07:29
поделиться

Вы можете использовать somelist[:], то есть срез типа somelist[1:2] от начала до конца, для создания (неглубокой) копии списка. Применение этого к вашему циклу for дает:

alist2 = []
for x in xrange(10):
   alist2.append(alist[x][:])

Это также можно записать в виде понимания списка:

alist2 = [item[:] for item in alist]
6
ответ дан 18 December 2019 в 07:29
поделиться

Если вы все равно уже перебираете список, то проще всего просто копировать внутренние списки по мере выполнения, как сказано в ответе seanmonstar.

Если вы просто хотите сделать глубокую копию списка, вы можете вызвать copy.deepcopy().

1
ответ дан 18 December 2019 в 07:29
поделиться

Я думаю, что copy.deepcopy() как раз для этого случая.

9
ответ дан 18 December 2019 в 07:29
поделиться

Обычно вы можете сделайте что-нибудь вроде:

new_list = old_list[:]

Так что, возможно, вы могли бы добавить это в свой единственный цикл for?

for x in range(10):
    alist2.append(alist[x][:])
0
ответ дан 18 December 2019 в 07:29
поделиться

сделать копию списка при добавлении.

  alist2.append(alist[x][:])
1
ответ дан 18 December 2019 в 07:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: