2016-04-06 2 views
0

У меня есть этот код:прилагая к многомерного массива в Python

philips_trousers = [] 
for i in range(0, 5): 
    philips_trousers.append(["T"] * 5) 
    philips_trousers.append(["R"] * 5) 
    philips_trousers.append(["O"] * 5) 
    philips_trousers.append(["U"] * 5) 
    philips_trousers.append(["S"] * 5) 
    philips_trousers.append(["E"] * 5) 
    philips_trousers.append(["R"] * 5) 
    philips_trousers.append(["S"] * 5) 
print philips_trousers 

которая выводит следующее:

[['T', 'T', 'T', 'T', 'T'], ['R', 'R', 'R', 'R', 'R'], ['O', 'O', 'O', 'O', 'O'], ['U', 'U', 'U', 'U', 'U'], ['S', 'S', 'S', 'S', 'S'], ['E', 'E', 'E', 'E', 'E'], ['R', 'R', 'R', 'R', 'R'], ['S', 'S', 'S', 'S', 'S'], ['T', 'T', 'T', 'T', 'T'], ['R', 'R', 'R', 'R', 'R'], ['O', 'O', 'O', 'O', 'O'], ['U', 'U', 'U', 'U', 'U'], ['S', 'S', 'S', 'S', 'S'], ['E', 'E', 'E', 'E', 'E'], ['R', 'R', 'R', 'R', 'R'], ['S', 'S', 'S', 'S', 'S'], ['T', 'T', 'T', 'T', 'T'], ['R', 'R', 'R', 'R', 'R'], ['O', 'O', 'O', 'O', 'O'], ['U', 'U', 'U', 'U', 'U'], ['S', 'S', 'S', 'S', 'S'], ['E', 'E', 'E', 'E', 'E'], ['R', 'R', 'R', 'R', 'R'], ['S', 'S', 'S', 'S', 'S'], ['T', 'T', 'T', 'T', 'T'], ['R', 'R', 'R', 'R', 'R'], ['O', 'O', 'O', 'O', 'O'], ['U', 'U', 'U', 'U', 'U'], ['S', 'S', 'S', 'S', 'S'], ['E', 'E', 'E', 'E', 'E'], ['R', 'R', 'R', 'R', 'R'], ['S', 'S', 'S', 'S', 'S'], ['T', 'T', 'T', 'T', 'T'], ['R', 'R', 'R', 'R', 'R'], ['O', 'O', 'O', 'O', 'O'], ['U', 'U', 'U', 'U', 'U'], ['S', 'S', 'S', 'S', 'S'], ['E', 'E', 'E', 'E', 'E'], ['R', 'R', 'R', 'R', 'R'], ['S', 'S', 'S', 'S', 'S']] 

До сих пор так хорошо, вы, вероятно, думаете, но я что-то интересно - почему Python заполняет philips_trousers так, как это делается? То есть, почему функция append() создает новые дочерние массивы с формой ['T', 'T', 'T', 'T', 'T'], ['R', 'R', 'R', 'R', 'R'] и т. Д., А не: ['T', 'R', 'O', 'U', 'S', 'E', 'R', 'S']?

+0

Почему вы ожидаете '['T', 'R', 'O', 'U', 'S', 'E', 'R', 'S']'? – user2357112

+0

Hhhhhmmm, это сложно выразить словами, но я думаю, что я ожидал, что он создаст пять дочерних массивов и заполнит их [«T»], затем добавит [«R»] к этим массивам и т. Д. И т. Д. –

+1

Вы вызываете 'append' в список' philips_trousers', а не в его подсписках. Вы не собираетесь присоединяться к подспискам списка. – user2357112

ответ

1

["T"] + ["T"] это то же самое, как ["T", "T"]. Умножение просто несколько раз. Таким образом, ["T"] * 5 - это то же самое, что и ["T", "T", "T", "T", "T"] . То, что вы видите в своем конечном списке, - это несколько таких списков. Если вы хотите кучу ["T", "R", "O", ...], вы можете сделать это:

philips_trousers = [] 

for _ in range(5): 
    philips_trousers.append(list("TROUSERS")) 

print philips_trousers 

, который в значительной степени короче вариант ответа Remuze в.


Не используйте список умножения с изменяемыми объектами, поскольку каждый элемент в списке будет тот же объект. Это означает, что изменение одного из них изменит их все.

0

["T"] * 5 сначала преобразуется в [['T'],['T'],['T'],['T'],['T']], который затем добавляется к пустому массиву. То же самое происходит и для каждой из других букв.

Чтобы получить функциональность, которую вы ищете, вы должны попробовать это:

philipsTrousers = [] 
for i in range(0, 5): 
    philipsTrousers.append(["T","R","O","U","S","E","R","S"]) 
print philipsTrousers 
+2

Ну, нет ... '[T] * 5' недопустимо (без кавычек), а' ["T"] * 5' создает единственный список, содержащий 5 "T" s ; а не 5 списков, содержащих один «Т» в списке списков. Чтобы получить '[['T'], ['T'], ['T'], ['T'], ['T']]' вам понадобится '[[" T "]] * 5' – jDo

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