Python: создайте дубликат массива - PullRequest
5 голосов
/ 16 марта 2010

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

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

print alist[1][1]

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

Спасибо, Dan

Ответы [ 6 ]

9 голосов
/ 16 марта 2010

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

6 голосов
/ 16 марта 2010

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

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

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

alist2 = [item[:] for item in alist]
4 голосов
/ 16 марта 2010

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

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

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

1 голос
/ 16 марта 2010

Если вы уже в любом случае перебираете список, просто скопируйте внутренние списки по ходу дела проще всего согласно ответу seanmonstar .

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

1 голос
/ 16 марта 2010

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

  alist2.append(alist[x][:])
0 голосов
/ 16 марта 2010

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

new_list = old_list[:]

Так что вы могли бы добавить это в свое единственное число для цикла?

for x in range(10):
    alist2.append(alist[x][:])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...