Как добавить в конец пустого списка?


81

У меня есть список:

list1=[]

длина списка не определена, поэтому я пытаюсь добавить объекты в конец списка 1, например:

for i in range(0, n):

    list1=list1.append([i])

Но мой вывод продолжает выдавать эту ошибку: AttributeError: объект 'NoneType' не имеет атрибута 'append'

Это потому, что list1 начинается как пустой список? Как исправить эту ошибку?


42
Нет -1 пожалуйста. Тот факт, что append () возвращает None, может обмануть новичков. Вопрос искренний.
e-satis

Ответы:


73

appendфактически меняет список. Кроме того, требуется элемент , а не список. Следовательно, все, что вам нужно, это

for i in range(n):
   list1.append(i)

(Кстати, обратите внимание, что range(n)в этом случае вы можете использовать .)

Я предполагаю, что ваше фактическое использование более сложное, но вы можете использовать понимание списка, которое для этого более питонично:

list1 = [i for i in range(n)]

Или, в этом случае, в Python 2.x range(n)фактически создается список, который вам уже нужен, хотя в Python 3.x он вам нужен list(range(n)).


спасибо, что последний бит был очень полезен и сильно сократил мой код
LostLin

@AndrewJaffe, а как насчет списка списков?
Py-ser

1
Это зависит от того, чем вы хотите заниматься. appendдобавляет к самому внешнему списку, но вы можете добавить его во вложенный список, индексируя его: a[-1].append(3)добавляет 3к последнему подсписку a.
Эндрю Джаффе

18

Вам не нужен оператор присваивания. append возвращает None.


void не существует в python. void на самом деле None
Jakob Bowyer

5

appendвозвращает None, поэтому на второй итерации вы вызываете метод appendNoneType. Просто удалите задание:

for i in range(0, n):
    list1.append([i])

3

У Миколы есть правильный ответ, но есть еще несколько объяснений. Он будет запущен в первый раз, но поскольку append возвращается None, после первой итерации цикла for ваше присвоение приведет list1к равенству, Noneи, следовательно, ошибка будет выдана на второй итерации.


3

Я лично предпочитаю +оператора, чем append:

for i in range(0, n):

    list1 += [[i]]

Но это создает новый список каждый раз, поэтому может быть не лучшим вариантом, если производительность критична.


1

Обратите внимание, что вы также можете использовать вставку, чтобы поместить число в нужную позицию в списке:

initList = [1,2,3,4,5]
initList.insert(2, 10) # insert(pos, val) => initList = [1,2,10,3,4,5]

А также обратите внимание, что в python вы всегда можете получить длину списка с помощью метода len ()


0

Как сказал Микола, append()возвращает пустоту, поэтому на каждой итерации вы устанавливаете list1 на nonetype, потому что append возвращает nonetype. На следующей итерации list1 имеет значение null, поэтому вы пытаетесь вызвать метод добавления значения null. У нулей нет методов, отсюда и ваша ошибка.


-3

используйте my_list.append (...) и не используйте и другие списки для добавления, поскольку список изменяемый.


2
Этот ответ трудно понять (я не уверен, что вы имеете в виду, например, под второй частью), и он либо повторяет информацию из существующих ответов (с 2014 года), либо (если воспринимать буквально) совершенно неверно (код OP не содержит my_listпеременная).
melpomene
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.