Неожиданное поведение Extend со списком в Python

Я пытаюсь понять, как работает расширение в Python, и это не совсем то, что я ожидаю. Например:

>>> a = [1, 2, 3]
>>> b = [4, 5, 6].extend(a)
>>> b
>>> 

Но я бы ожидал:

[4, 5, 6, 1, 2, 3]

Почему это возвращает None вместо расширения списка?

Ответ 1

Метод extend() присоединяется к существующему массиву и возвращает None. В вашем случае вы создаете массив - [4, 5, 6] - на лету, расширяя его и затем отбрасывая. Переменная b заканчивается возвращаемым значением None.

Ответ 2

list методы работают по большей части и возвращают None.

>>> a = [1, 2, 3]
>>> b = [4, 5, 6]
>>> b.extend(a)
>>> b
[4, 5, 6, 1, 2, 3]

Ответ 3

extend расширяет свой операнд, но не возвращает значение. Если вы сделали:

b = [4, 5, 6]
b.extend(a)

Затем вы получите ожидаемый результат.

Ответ 4

Другие указали на многие методы list, особенно те, которые мутируют список, возвращают None, а не ссылку на список. Причина, по которой они делают это, заключается в том, что вы не путаетесь о том, сделана ли копия списка. Если вы могли бы написать a = b.extend([4, 5, 6]), то есть a ссылка на тот же список, что и b? Был ли b изменен инструкцией? Возвращая None вместо мутировавшего списка, такое утверждение становится бесполезным, вы быстро выясняете, что a не имеет в себе того, что вы считали, и вы учитесь просто писать b.extend(...). Таким образом, отсутствует ясность.

Ответ 5

У меня была эта проблема, и в то время как другие ответы дают правильные объяснения, решение/обходное решение мне понравилось не здесь. Использование оператора сложения будет объединять списки вместе и возвращать результат. В моем случае я был бухгалтером color как 3-значный список и opacity как плавающий, но библиотеке нужен цвет в виде 4-значного списка с непрозрачностью, как 4-я цифра. Я не хотел называть переменную throwaway, поэтому этот синтаксис соответствовал моим потребностям:

color = [1, 1, 0]
opacity = 0.75
plot.setColor(color + [opacity])

Это создает новый список непрозрачности "на лету" и новый список после конкатенации, но это хорошо для моих целей. Мне просто нужен компактный синтаксис для расширения списка с помощью float и возврата результирующего списка, не затрагивая исходный список или float.