#python #list #random
#python #Список #Случайный
Вопрос:
Я пытаюсь напечатать своего рода 2d-массив, используя списки размером nxn. Проблема, с которой я сталкиваюсь, заключается в том, что список становится конечным набором случайных чисел.
Например, если первый набор чисел равен [1,5,7], то metaList становится [[1,5,7],1,2]. Но, если второй набор чисел равен [3,4,5], то мета-список изменится на [[3,4,5],[3,4,5],2] Окончательный список — это три идентичных списка, но я бы хотел, чтобы они были разными.
Извините, если это что-то простое. Заранее спасибо за любую помощь, которую вы можете предложить. Вот код.
import random
n = 3
def aBuilder():
metaList = range(n)
tempList = range(n)
for x in range(n):
metaList[x] = tempList
print metaList
for y in range (n):
tempList[y] = random.randint(1,9)
print tempList[y]
return metaList
def printList(List):
for x in range(n):
print List[x]
printList(aBuilder())
Комментарии:
1. Потому что вы заполняете
metaList
ссылками на один и тот же объект списка и изменяете его.2. @jonrsharpe Я собирался ответить, в чем проблема, и дать более простую функцию. Я не совсем понимаю, почему это дубликат вопроса, связанного со словарями?
3. @timgeb Я снова открыл, но проблема идентична — заполнение списка ссылками на изменяемый контейнер
4. О, хорошо, я вижу причину, по которой вы закрываете его сейчас.
Ответ №1:
Проблема в том, что metaList
содержит только ссылки на tempList
, поэтому при tempList
изменениях будут и элементы в metaList
. Решение состоит в том, чтобы изменить строку
metaList[x] = tempList
Для
metaList[x] = tempList[:]
для того, чтобы сделать копию tempList
каждого назначения.
Более простое решение вашей проблемы может выглядеть следующим образом:
import random
def randlists(n, start, to):
return [[random.randint(start,to) for i in range(n)] for i in range(n)]
print(randlists(3,1,9))