Я пытаюсь создать многомерный список. Input будет:создание многомерного списка в python
L1 = [2,3,4]
L2 = [5,6,7]
Выход был бы х ** у, где х из L1 и х из L2
L3 = [[32,64,128],[243,729,2187],[1024,4096,16384]]
Мой код, как показано ниже:
L1 = [2,3,4]
L2 = [5,6,7]
L3 = [[None] * len(L1)] * len(L2)
c=0
for x in L1:
d=0
for y in L2:
L3[c][d] = x ** y
d = d+1
c = c+1
print L3
Здесь вывод:
[[1024,4096,16384],[1024,4096,16384],[1024,4096,16384]]
Во время отладки я узнал:
во время присвоения «L3 [0] [0]», его присвоение значений L3 [0] [0], L3 [1] [0], L3 [ 2] [0]. Он должен назначить девять раз. Во время каждого задания присваивается 3 места. Я не понимаю, как это работает.
Я попытался напечатать
id(L3[0])
id(L3[1])
id(L3[2])
и все печати и тот же адрес ячейки памяти.
Это связано с тем же адресом памяти, что значение передается сразу на 3 места (значение x ** y одновременно переходит в L3 [0] [0], L3 [1] [0], L3 [2] [0]?
Может кто-нибудь помочь мне в этом.
Спасибо заранее, SRP
'*' копирует по ссылке, поэтому изменение первого элемента изменяет все остальные. –
@akshat ..... если мы попытаемся сделать L3 одномерным списком с [None] * (Len (L1) * Len (L2)) и попытаться назначить вещи, то он отлично работает, значит, он сохраняет все результаты правильно в одномерный список L3. Во время создания одномерного списка также копируются по ссылке. Тогда как это работает? –
'None' - как целые числа, строки и другие примитивы - неизменный тип. '*', применяемый к неизменяемым типам, приводит к копированию по значению, поскольку копирование по ссылке по умолчанию соответствует заданию для неизменяемых типов. То же самое не выполняется для '[None]', потому что теперь у вас есть изменяемый тип - список - поэтому '*' копирует по ссылке. –