Combinar elementos en la lista: parece que Python trata el mismo elemento de dos maneras diferentes y no sé por qué

Estoy trabajando a través de CodeAcademy y tengo una pregunta que está sin respuesta allí. La tarea es tomar una lista de listas y hacer una lista única de todos sus elementos. El código inmediatamente debajo es mi respuesta que funcionó. Pero lo que no entiendo es por qué el “elemento” se trata como elementos en una lista para ese código, mientras que (vea el comentario a continuación) …

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) 

… el “elemento” en el código a continuación se trata como la lista completa en lugar de los elementos de una lista. El siguiente código da la salida:

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

También intenté usar: new_list.append (item [0:] [0:]) pensando que iteraría a través del índice y subíndice pero dio el mismo resultado. Simplemente no entiendo cómo se está interpretando esto.

 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) 

Además, sé que podría agregar otro for-loop al código anterior, y entiendo por qué funciona, pero aún no entiendo con una línea de diferencia por qué Python interpreta esto de manera diferente.

El operador de agregar += in situ en una lista hace lo mismo que llamar a list.extend() en new_list . .extend() toma un iterable y agrega todos y cada uno de los elementos a la lista.

list.append() por otro lado, agrega un solo elemento a la lista.

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

Martijn (como siempre) lo ha explicado bien. Sin embargo, el enfoque Pythonic (solo para referencia) sería:

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