Як додати кінець порожнього списку?


81

У мене є список:

list1=[]

довжина списку не визначена, тому я намагаюся додати об'єкти до кінця списку1, наприклад:

for i in range(0, n):

    list1=list1.append([i])

Але мій результат продовжує давати цю помилку: AttributeError: 'NoneType' об'єкт не має атрибута 'append'

Це тому, що list1 починається як порожній список? Як виправити цю помилку?


42
Ні -1, будь ласка. Той факт, що append () повертає None, може обдурити початківців. Питання справжнє.
e-satisfa

Відповіді:


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, а як щодо списку списків?
Пи-сер

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

18

Вам не потрібен оператор присвоєння. append повертає None.


void не існує в python. void насправді немає
Jakob Bowyer

5

appendповертає None, тому на другій ітерації ви викликаєте метод appendNoneType. Просто видаліть призначення:

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

3

Микола має правильну відповідь, але трохи більше пояснень. Він запускатиметься вперше, але оскільки додавання повертається 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, має нетиповий тип, оскільки додаток повертає нетиповий. На наступній ітерації list1 має значення null, тому ви намагаєтесь викликати метод додавання null. Нулі не мають методів, звідси ваша помилка.


-3

використовуйте my_list.append (...), а не використовуйте та інші списки для додавання, оскільки список можна змінювати.


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