Объединение элементов в список: похоже, что python рассматривает один и тот же элемент двумя разными способами, и я не знаю, почему

Я прокладываю себе путь через CodeAcademy, и у меня есть вопрос, который остается без ответа. Назначение – взять список списков и составить единый список всех его элементов. Код, приведенный ниже, – это мой ответ, который сработал. Но я не понимаю, почему «элемент» рассматривается как элемент в списке для этого кода, тогда как (см. Комментарий далее) …

m = [1, 2, 3] n = [4, 5, 6] o = [7, 8, 9] def join_lists(*args): new_list = [] for item in args: new_list += item return new_list print join_lists(m, n, o) 

… «элемент» в приведенном ниже коде рассматривается как полный список, а не элементы в списке. Код ниже дает вывод:

  [[1, 2, 3], [4, 5, 6], [7, 8, 9]] 

Я также попытался использовать: new_list.append (item [0:] [0:]), считая, что он будет перебирать индекс и субиндекс, но он дал тот же результат. Я просто не понимаю, как это интерпретируется.

 m = [1, 2, 3] n = [4, 5, 6] o = [7, 8, 9] def join_lists(*args): new_list = [] for item in args: new_list.append(item) return new_list print join_lists(m, n, o) 

Кроме того, я знаю, что я мог бы добавить еще один цикл для кода выше, и я понимаю, почему это работает, но я до сих пор не понимаю с одной линией разницы, почему Python интерпретирует это по-разному.

Оператор добавления += in-place в списке выполняет то же самое, что и вызов list.extend() в new_list . .extend() принимает итерируемый и добавляет каждый элемент в список.

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

 >>> lst = [] >>> lst.extend([1, 2, 3]) >>> lst [1, 2, 3] >>> lst.append([1, 2, 3]) >>> lst [1, 2, 3, [1, 2, 3]] 

Мартин (как всегда) объяснил это хорошо. Тем не менее, для (только для справки) Питоновского подхода было бы:

 def join_lists(*args): from itertools import chain return list(chain.from_iterable(args))