Ошибка распределения значений массива Python - PullRequest
0 голосов
/ 23 ноября 2018

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

Я делаюнесколько функций, которые я могу использовать в будущих программах на Python для работы с массивами, например, определение их и отображение.Однако я наткнулся на странную ошибку или сбой при попытке установить значения в порядке в массиве слева направо.По какой-то причине, когда программа устанавливает значения для последнего значения y (или фактически для любого значения), она устанавливает это значение для всего столбца вместо одного, хотя у меня только 2 цикла.Вот мой код:

def gen(xLen, yLen, fill = 0):
    mainArr = list()
    secArr = list()
    for i in range(xLen):
        secArr.append(fill)
    for i in range(yLen):
        mainArr.append(secArr)
    return mainArr

def sums(xLen, yLen):
    newArr = gen(xLen, yLen)
    a = 0
    for y in range(yLen):
        for x in range(xLen):
            newArr[y][x] = a
            print(str(x) + ", " + str(y) + " = " + str(a)) #For debugging, what the array SHOULD contain
            a += 1
    return newArr

(просто запустите это с print(sums(5, 5)))

Вместо возврата с [[0, 1, 2, 3, 4], ... [20, 21, 22, 23, 24]], он возвращается со списком, полным [20, 21, 22, 23, 24], и я действительно не понимаюНе знаю, почему.

Я не хочу добавлять новый список в другой список со значениями, уже содержащимися в них, например arr.append([0, 1, 2, 3, 4]), поскольку массив уже создан.Почему это не работает ???Это беспокоило меня уже несколько недель!

Ответы [ 3 ]

0 голосов
/ 23 ноября 2018

В то время как ответ Джулиана Пеллера отвечает на ваш конкретный вопрос, я бы предложил более чистый и более питонический способ выполнения ваших задач:

def gen2(xLen, yLen, fill=0):
    return [[fill for x in range(xLen)] for y in range(yLen)]

def sums2(xLen, yLen):
    return [[y*yLen+x for x in range(xLen)] for y in range(yLen)]

Эти функции используют списочные выражения, которые более читабельны и избегают ошибоккак твой например

0 голосов
/ 23 ноября 2018

Вы видите те же эффекты, что и человек, который задал этот вопрос .Я надеюсь, что мой ответ и другие связанные ответы помогут вам понять, почему это происходит, и как это исправить.

0 голосов
/ 23 ноября 2018

secArr - это ссылка на список.Таким образом, в gen вы фактически помещаете n раз ту же ссылку на secArr в mainArr.

Добавьте print(newArr) в для, чтобы проверить это.

Выможно запустить newArr[0][1] = 1, чтобы увидеть, как затрагиваются все внутренние списки.

Вы можете решить эту проблему, создав копию secArr перед добавлением ее к mainArr в gen, например:

mainArr.append(secArr[:])

Подробнее по теме здесь или здесь .

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