Mam listę:
list1=[]
długość listy jest nieokreślona, więc próbuję dołączyć obiekty na końcu listy1 w następujący sposób:
for i in range(0, n):
list1=list1.append([i])
Ale w moich wynikach nadal pojawia się ten błąd: AttributeError: Obiekt „NoneType” nie ma atrybutu „append”
Czy to dlatego, że lista1 zaczyna się jako pusta lista? Jak naprawić ten błąd?
Odpowiedzi:
append
faktycznie zmienia listę. Ponadto wymaga elementu , a nie listy. Dlatego wszystko, czego potrzebujesz, tofor i in range(n): list1.append(i)
(Nawiasem mówiąc, pamiętaj, że
range(n)
w tym przypadku możesz użyć .)Zakładam, że twoje rzeczywiste użycie jest bardziej skomplikowane, ale możesz być w stanie użyć rozumienia list, które jest bardziej pythonowe w tym przypadku:
list1 = [i for i in range(n)]
Lub, w tym przypadku, w Pythonie 2.x
range(n)
w rzeczywistości tworzy listę, którą już chcesz, chociaż w Pythonie 3.x, potrzebujeszlist(range(n))
.źródło
append
dodaje do listy najbardziej zewnętrznej, ale możesz dołączyć do listy zagnieżdżonej, indeksując ją:a[-1].append(3)
dołącza3
do ostatniej podlistya
.Nie potrzebujesz operatora przypisania. append zwraca None.
źródło
append
zwraca None, więc w drugiej iteracji wywołujesz metodęappend
NoneType. Po prostu usuń przypisanie:for i in range(0, n): list1.append([i])
źródło
Mikola ma właściwą odpowiedź, ale trochę więcej wyjaśnień. Uruchomi się za pierwszym razem, ale ponieważ append zwraca
None
, po pierwszej iteracji pętli for, twoje przypisanie spowodujelist1
wyrównywanie,None
a zatem błąd zostanie wyrzucony przy drugiej iteracji.źródło
Osobiście wolę
+
operatora niżappend
:for i in range(0, n): list1 += [[i]]
Ale to tworzy nową listę za każdym razem, więc może nie być najlepsza, jeśli wydajność jest krytyczna.
źródło
Pamiętaj, że możesz również użyć wstawiania, aby umieścić numer na wymaganej pozycji na liście:
initList = [1,2,3,4,5] initList.insert(2, 10) # insert(pos, val) => initList = [1,2,10,3,4,5]
Zauważ też, że w Pythonie zawsze możesz uzyskać długość listy za pomocą metody len ()
źródło
Jak powiedział Mikola,
append()
zwraca void, więc każda iteracja, którą ustawiasz list1 na inny niż typ, ponieważ append zwraca wartość nonetype. W następnej iteracji list1 ma wartość null, więc próbujesz wywołać metodę append wartości null. Wartości null nie mają metod, stąd Twój błąd.źródło
użyj my_list.append (...) i nie używaj, a inne listy do dołączenia jako lista są zmienne.
źródło
my_list
zmienna).