Member 12961167 Ответов: 2

Python (пытается понять поток)


Напишите программу, которая принимает 2 цифры, X,Y в качестве входных данных и генерирует 2-мерный массив. Значение элемента в i-й строке и j-м столбце массива должно быть равно i*j.
Примечание: i=0,1.., X-1; j=0,1, ¡Y-1.
Пример
Предположим, что программе даны следующие входные данные:
3,5
Тогда вывод программы должен быть:
[[0, 0, 0, 0, 0], [0, 1, 2, 3, 4], [0, 2, 4, 6, 8]]

Моя программа:
x = int(raw_input())
y = int(raw_input())

l=[]
for i in range(x):   
    inner_list = []
    for j in range(y):
        inner_list.append((i*j))
    l.append(inner_list)
print l



Вместо определения 'inner_list' внутри 'я', если я определяю это снаружи, как в:
x = int(raw_input())
y = int(raw_input())

l=[]
inner_list = []
for i in range(x):   
    
    for j in range(y):
        inner_list.append((i*j))
    l.append(inner_list)


Я не в состоянии понять результат:

Выход:
[0] / inner_list
[0, 0] /inner_list
[0, 0, 0] /inner_list
[[0, 0, 0]] /l
[0, 0, 0, 0] /inner_list
[0, 0, 0, 0, 1] /inner_list
[0, 0, 0, 0, 1, 2] /inner_list
[[0, 0, 0, 0, 1, 2], [0, 0, 0, 0, 1, 2]] /l
[0, 0, 0, 0, 1, 2, 0] /inner_list
[0, 0, 0, 0, 1, 2, 0, 2] /inner_list
[0, 0, 0, 0, 1, 2, 0, 2, 4] /inner_list
[[0, 0, 0, 0, 1, 2, 0, 2, 4], [0, 0, 0, 0, 1, 2, 0, 2, 4], [0, 0, 0, 0, 1, 2, 0, 2, 4]] /l

Почему конечный результат выглядит так, как показано выше
[[0, 0, 0, 0, 1, 2, 0, 2, 4], [0, 0, 0, 0, 1, 2, 0, 2, 4], [0, 0, 0, 0, 1, 2, 0, 2, 4]] /l

и нет

[[0,0,0],[0,0,0,0,1,2],[0,0,0,0,1,2,0,2,4]]

Что я уже пробовал:

Я перепробовал все, но безуспешно.

2 Ответов

Рейтинг:
1
Рейтинг:
0

Patrice T

Ваш вывод уже говорит вам все

Цитата:
[0, 0, 0, 0, 1, 2, 0, 2, 4] /inner_list
[[0, 0, 0, 0, 1, 2, 0, 2, 4], [0, 0, 0, 0, 1, 2, 0, 2, 4], [0, 0, 0, 0, 1, 2, 0, 2, 4]] /l

Когда вы добавляете inner_list к l, вы просто добавляете указатель на inner_list- ты его не копируешь. С помощью отладчика вы увидите l расти каждый раз, когда вы добавляете к inner_list.
----------
Когда вы не понимаете, что делает ваш код или почему он делает то, что делает, ответ таков: отладчик.
Используйте отладчик, чтобы увидеть, что делает ваш код. Он позволяет вам выполнять строки 1 на 1 и проверять переменные по мере их выполнения, это невероятный инструмент обучения.

Отладчик-Википедия, свободная энциклопедия[^]

Отладчик здесь для того, чтобы показать вам, что делает ваш код, и ваша задача-сравнить его с тем, что он должен делать.
В отладчике нет никакой магии, он не находит ошибок, он просто помогает вам. Когда код не делает того, что ожидается, вы близки к ошибке.

[Обновление]
Цитата:
Когда я добавляю 'внутренний-список' К 'Л', в самом конце, почему я получаю 3 копии inner_list как конечное значение 'л'
[0, 0, 0, 0, 1, 2, 0, 2, 4] /inner_list
[[0, 0, 0, 0, 1, 2, 0, 2, 4], [0, 0, 0, 0, 1, 2, 0, 2, 4], [0, 0, 0, 0, 1, 2, 0, 2, 4]] /l
а почему бы и нет
[[0, 0, 0],[0, 0, 0, 0, 1, 2],[0, 0, 0, 0, 1, 2, 0, 2, 4]] в качестве конечного значения 'l'.
Именно так работает Python.
Когда вы добавляете в l, вы не копируете список, а добавляете активную ссылку на него. l.


0x01AA

Нет, не ответ. Нейтраль 4 после распознавания усилия

Patrice T

4-это префект для меня.
Просто улучшилось.

Member 12961167

Когда я добавляю 'внутренний-список' К 'Л', в самом конце, почему я получаю 3 копии inner_list как конечное значение 'л'

[0, 0, 0, 0, 1, 2, 0, 2, 4] /inner_list
[[0, 0, 0, 0, 1, 2, 0, 2, 4], [0, 0, 0, 0, 1, 2, 0, 2, 4], [0, 0, 0, 0, 1, 2, 0, 2, 4]] /l

а почему бы и нет
[[0, 0, 0],[0, 0, 0, 0, 1, 2],[0, 0, 0, 0, 1, 2, 0, 2, 4]] в качестве конечного значения 'l'.

Я прошел по ссылке: http://stackoverflow.com/questions/27821568/how-does-append-method-work-in-python
и http://stackoverflow.com/questions/986006/how-do-i-pass-a-variable-by-reference понять то же самое.

Я новичок в программировании на Python, поэтому было бы удобно, если бы кто-нибудь мог объяснить шаг за шагом. Большое спасибо!!!