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

81

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

list1=[]

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

for i in range(0, n):

    list1=list1.append([i])

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

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

LostLin
источник
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