2016-09-07 3 views
1

Я пытаюсь создать многомерный список. 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

+0

'*' копирует по ссылке, поэтому изменение первого элемента изменяет все остальные. –

+0

@akshat ..... если мы попытаемся сделать L3 одномерным списком с [None] * (Len (L1) * Len (L2)) и попытаться назначить вещи, то он отлично работает, значит, он сохраняет все результаты правильно в одномерный список L3. Во время создания одномерного списка также копируются по ссылке. Тогда как это работает? –

+0

'None' - как целые числа, строки и другие примитивы - неизменный тип. '*', применяемый к неизменяемым типам, приводит к копированию по значению, поскольку копирование по ссылке по умолчанию соответствует заданию для неизменяемых типов. То же самое не выполняется для '[None]', потому что теперь у вас есть изменяемый тип - список - поэтому '*' копирует по ссылке. –

ответ

3

Может быть, это то, что вы хотите?

[[x**y for y in L2] for x in L1] 

[[32, 64, 128], [243, 729, 2187], [1024, 4096, 16384]]

+0

Да. Я хочу обойтись без понимания списка. –

0

Вот что я бы

L1 = [2,3,4] 
L2 = [5,6,7] 
L3 = [] 
for x in L1: 
    tmp = [] 
    for y in L2: 
     tmp.append(x ** y) 
    L3.append(tmp) 

print L3 

[[ 32, 64, 128], [243, 729, 2187], [1024, 4096, 16384]]

Смежные вопросы