Python Двумерный Запрос .. - PullRequest
1 голос
/ 31 июля 2011

Я вижу очень необычное поведение в Python .. Пожалуйста, дайте мне знать, что я делаю неправильно !!

bc = [[0]*(n+1)]*(n+1)

for i in range(n+1):
    bc[i][i] = 1

print (bc)        

Вывод

[[1, 1, 1, 1], [1, 1, 1, 1], [1, 1, 1, 1], [1, 1, 1, 1]]

Я пытаюсь инициализироватьдиагональные элементы двумерного массива равны 1, но все элементы инициализируются с 1. Я думаю, что я что-то не так делаю с доступом к двумерному массиву ..

Также, пожалуйста, дайте мне знать, как я могу использовать двациклы для доступа ко всем элементам двумерного массива .. мой следующий шаг ..

Спасибо.

Ответы [ 3 ]

6 голосов
/ 31 июля 2011

Ваш массив инициализирован неправильно.Правильный способ инициализации 2d-массива таков:

bc = [[0 for i in xrange(n + 1)] for i in xrange(n + 1)]

Это распространенная ошибка, но оператор * копирует указатель на список, а не копирует список, поэтому, похоже, у вас есть 2dсписок, у вас фактически есть 1d список указателей на тот же список.

3 голосов
/ 31 июля 2011

проблема в том, что каждый массив в вашем массиве является одним и тем же массивом в памяти. вам нужен новый массив каждый раз. [[0]] * 6, например, создаст 6 одинаковых массивов в массиве, редактирование одного из них обновит другие.

, например

>>> x=[1]
>>> y=x
>>> x.append(3)
>>> x
[1, 3]
>>> y
[1, 3]
>>> z=[x]*3
>>> x.append(6)
>>> z
[[1, 3, 4, 6], [1, 3, 4, 6], [1, 3, 4, 6]]

Вот исправление, просто отредактировав bc для n + 1 различных массивов:

n=4
bc = [[0]*(n+1) for i in range(n+1)]

for i in range(n+1):
    bc[i][i] = 1

print (bc)

[[1, 0, 0, 0, 0], [0, 1, 0, 0, 0], [0, 0, 1, 0, 0], [0, 0, 0, 1, 0], [0, 0, 0, 0, 1]]
0 голосов
/ 31 июля 2011

Попробуйте это:

bc = [[0 for i in range(n+1)] for j in range(n+1)]

В вашем примере у вас есть только один (!) Экземпляр [0], на который ссылаются несколько раз.Поэтому, если вы измените этот экземпляр, все ссылки будут изменены.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...