Добавление к списку списков в цикле for - PullRequest
2 голосов
/ 27 октября 2019

В настоящее время я перебираю одно значение списка. На каждой итерации я добавляю список в новый список, чтобы получить список списков. Однако результаты, которые я получаю, не соответствуют ожидаемым.

Я максимально упростил проблему и пришел к следующему:

def Function():
     ListOfLists = []
     Lists = [0]
     for j in range(0, 5):
         Lists[0] = Lists[0] + 1
         print(Lists)
         ListOfLists.append(Lists)
     print("ListofLists:")
     print(ListOfLists)

Function()

Вывод дает мне это:

[1]
[2]
[3]
[4]
[5]
ListofLists:
[[5], [5], [5], [5], [5]]

Я бы ожидал, что результат будет:

[1]
[2]
[3]
[4]
[5]
ListofLists:
[[1], [2], [3], [4], [5]]

Где я иду не так? Спасибо

Ответы [ 4 ]

1 голос
/ 27 октября 2019

Вы должны добавить копию списка. Когда вы говорите List, это ссылка. Когда List изменяется, ListOfLists изменяется. Создание копии предотвращает это так называемое (не) ожидаемое поведение.

Замените эту строку кода:

ListOfLists.append(Lists)

на:

ListOfLists.append(Lists[:])
0 голосов
/ 27 октября 2019

Когда вы добавляете Lists к ListofLists, он не создает отдельную копию списка и не добавляет его. Вместо этого он просто добавляет ссылку на список List внутри ListofLists. Это часто сбивает с толку как новичка. Если вы измените List в следующий раз, значение внутри ListofLists также изменится, так как они оба ссылаются на один и тот же список. Если вы хотите каждый раз иметь совершенно отдельный список, вы должны использовать метод copy() в списке или `Lists [:] '. Или вы можете создать список на лету при добавлении, как показано ниже:

ListofLists = []
for number in range(1,6):
    print([number])
    ListofLists.append([number])
print(ListofLists)

И гораздо более простым и удобочитаемым способом будет использование понимания списка, например:

ListofLists = [[number] for number in range(1, 6)]
print(ListofLists)
0 голосов
/ 27 октября 2019

Попробуйте это:

def Function():
    ListOfLists = []
    for j in range(0, 5):
        ListOfLists.append([j+1])
    print(ListOfLists)
Function() 
0 голосов
/ 27 октября 2019

Это потому, что все добавленные экземпляры ссылаются на один и тот же адрес в памяти.

ПРОБЛЕМА:

In [1]: def Function(): 
   ...:      ListOfLists = [] 
   ...:      Lists = [0] 
   ...:      for j in range(0, 5): 
   ...:          Lists[0] = Lists[0] + 1 
   ...:          print(Lists) 
   ...:          ListOfLists.append(Lists) 
   ...:      print("ListofLists:") 
   ...:      print(ListOfLists) 
   ...:  
   ...: Function()                                                                             
[1]
[2]
[3]
[4]
[5]
ListofLists:
[[5], [5], [5], [5], [5]]

РЕШЕНИЕ:

Проверка Проверка В чем разница между списком и списком [:] в python? .

Используйте [:] для создания другого объекта (мелкая копия) в этом случае. Вы читаете о глубоких копиях и мелких копиях в Python, чтобы понять, как на самом деле Python работает со ссылками. Для получения более подробной информации, проверьте https://www.programiz.com/python-programming/shallow-deep-copy.

Заменить ListOfLists.append(Lists) на ListOfLists.append(Lists[:]).

In [2]: def Function(): 
   ...:      ListOfLists = [] 
   ...:      Lists = [0] 
   ...:      for j in range(0, 5): 
   ...:          Lists[0] = Lists[0] + 1 
   ...:          print(Lists) 
   ...:          ListOfLists.append(Lists[:]) 
   ...:      print("ListofLists:") 
   ...:      print(ListOfLists) 
   ...:  
   ...: Function()                                                                             
[1]
[2]
[3]
[4]
[5]
ListofLists:
[[1], [2], [3], [4], [5]]

In [3]:            
...