Проблема с заполнением списка другими списками, содержащими случайные числа.

#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))