2015-07-30 1 views
0

Мне нужно понять, почему:ошибка типа при попытке расширить список в Python

years = range(2010,2016) 
years.append(0) 

возможно, возвращение:

[2010,2011,2012,2013,2014,2015,0] 

и

years = range(2010,2016).append(0) 

или

years = [0].extend(range(2010,2016)) 

не работает?

Я понимаю, что это ошибка типа сообщения, которое я получил. Но я хотел бы получить немного больше объяснений.

+1

Ваша последняя строка в основном делает это: настройте анонимный список '[0]', затем 'extend()' этот список с результатом 'range()', сохраните результат 'extend()' (который '' '' '' '' '' '' '' '' '' ', а затем ** выбросить ** этот список, потому что он никогда не был связан с именем. –

+0

Вы должны действительно показать фактическую ошибку, которую вы получите. Либо * оба * примера производят 'TypeError' (используя Python 3), либо не делают (Python 2), но вы заканчиваете' years' установленным 'None'. Какой из двух на самом деле происходит? Можете ли вы предоставить полную трассу? –

ответ

5

Вы храните результат метода list.append() или list.extend(); оба изменяют список на месте и возвращают None. Они делают не снова возвращают объект списка.

Не храните результат None; сохраните результат range(), , затем продлить или добавить. В качестве альтернативы, использовать конкатенацию:

years = range(2010, 2016) + [0] 
years = [0] + range(2010, 2016) 

Обратите внимание, что я предполагаю, что вы используете Python 2 (ваш первый пример не будет работать в противном случае). В Python 3 range() не создает список; Вы должны были бы использовать функцию list(), чтобы преобразовать его в один:

years = list(range(2010, 2016)) + [0] 
years = [0] + list(range(2010, 2016)) 
+0

Большое спасибо за объяснения. –

1

append и extend операции над списками, ничего не возвращает (возврат только None). Вот почему years не список, которого вы ожидали.

0

В Python 3range возвращает экземпляр класса диапазона, а не список. Если вы хотите, чтобы манипулировать результатом range вам нужен список, так:

years = list(range(2010,2016)) 
years.append(2016) 

Наконец, (и аналогично выше Append) расширить свою деятельность на списке вы звоните его от, а не возвращать новый список так:

years = list(range(2010,2016)) 
years.extend(list(range(2016,2020))) 

* в то время как Python 2 в range функция делает возвращает список, приведенный выше код будет по-прежнему работать нормально в Python 2 *

Надеюсь, это поможет!

+0

@MartijnPieters: Я скорректировал свое объяснение, чтобы отразить ваш вышеприведенный момент. Пожалуйста, переоцените, поскольку я думаю, что вы прочитали старую версию моего ответа. Я не предлагал 'years = list (range (2010, 2016)) .append (0) 'был правильным. – SteJ

+0

@MartijnPieters: Пожалуйста, перечитайте мой ответ - я не храню значение ни того, ни другого. – SteJ

+1

мои извинения; мой взгляд на мобильный телефон в вашем ответе заставил его выглядеть так, как вы (строки выглядели обернутыми, а не отдельными). –