Перепишите значение в списке списков - PullRequest
0 голосов
/ 01 февраля 2020

У меня есть скрипт, который составляет список, представляющий игровую площадку:

#Script:
import math
listx=[]
List=[]
N_M=input("Enter N M: ").split()
n=int(N_M[0])
m=int(N_M[1])
for i in range(m):
    listx+=[0]
for i in range(n):
    List.append(listx)
print(List)

#Example of playground for M=3 and N=3:
[0,0,0] 
[0,0,0] 
[0,0,0]

Затем я хочу изменить определенное место на 1

List[0][1]=1

Это должно (если Я правильно понимаю) измените его на:

[0,1,0]
[0,0,0] 
[0,0,0]

Но вместо этого он меняет каждый список на:

[0,1,0]
[0,1,0] 
[0,1,0]

Пожалуйста, помогите! Большое спасибо за совет!

Ответы [ 3 ]

3 голосов
/ 01 февраля 2020

Этот бит:

for i in range(n):
    List.append(listx)

Добавляет один и тот же список (listx) к List три раза. Поэтому, когда вы меняете его в одном месте, все ссылки меняются, потому что все они указывают на один и тот же список.

Кроме того, в качестве примечания: не называйте переменные List с большой буквы, потому что это делает другие (и программное обеспечение) думают, что это класс. И имя list, конечно, еще хуже, потому что это будет тень типа list. Придумайте имена, которые имеют смысл и не являются слишком общими c - как playground.

Более эффективный способ создания списка n x m:

playground = [[0] * m for _ in range(n)]

Бит [0] * m создает список с m нулями; это работает, потому что на число не ссылаются как на список, и нули не будут копиями одной и той же переменной.

* for _ in range(n) заставляет результирующий список заполняться n из этих списков. _ просто означает, что вы ничего не делаете с числом из range(), оно существует только для нескольких повторений, и for l oop нужно что-то в этом месте, либо переменную, либо _ "пофиг".

1 голос
/ 01 февраля 2020

Во втором for-l oop вы добавляете список тот же к List n раз.

for i in range(n):
    List.append(listx)

Вам необходимо сделать копии listx и использовать их внутри List. Например:

for i in range(n):
    List.append(listx[::])

listx[::] делает копию listx для использования.

0 голосов
/ 01 февраля 2020

За секунду для l oop вы добавляете один и тот же список много раз, вы добавляете «представление / ссылку», а не фактический список, поэтому во второй четверке вы должны добавить копию listx , для этого вы можете использовать:

  • list(listx)
  • listx[::]
  • listx.copy()

Как вы хотите чтобы купить яблоки, но у вас есть только одна и еще 3 фотографии первого яблока, вы можете сказать, что у вас есть 4 яблока

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