2011-09-21 22 views
10

Estoy tratando de entender cómo funciona la extensión en Python y no está haciendo exactamente lo que esperaría. Por ejemplo:Comportamiento inesperado de Extender con una lista en Python

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

Pero lo que habría esperado:

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

¿Por qué es que el retorno de una Ninguno en lugar de extender la lista?

+5

Usted esperaba lo que 'b = [4, 5, 6] + a' hace. –

Respuesta

22

El método extend() anexa a la matriz existente y devuelve None. En su caso, está creando una matriz - [4, 5, 6] - sobre la marcha, ampliándola y luego descartándola. La variable b termina con el valor de retorno de None.

+0

Gracias, eso tiene perfecto sentido. – TimothyAWiseman

6

list métodos funcionan en su lugar en su mayor parte, y devuelven None.

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

extend extiende su operando, pero no devuelve un valor. Si lo hubiera hecho:

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

Entonces obtendría el resultado esperado.

2

Otros han señalado muchos métodos list, particularmente los que mutan la lista, devuelven None en lugar de una referencia a la lista. La razón hacen esto para que no te confundas sobre si se hace una copia de la lista. Si pudiera escribir a = b.extend([4, 5, 6]), entonces es a una referencia a la misma lista que b? ¿Fue b modificado por la declaración? Al devolver None en lugar de la lista de mutaciones, tal afirmación es inútil, se da cuenta rápidamente de que a no tiene lo que usted pensó que era, y en su lugar aprende a escribir b.extend(...). Por lo tanto, la falta de claridad se elimina.

1

Tuve este problema y mientras las otras respuestas proporcionan explicaciones correctas, la solución/solución alternativa que me gusta no está aquí. El uso del operador de adición concatenará listas juntas y devolverá el resultado. En mi caso, estaba contabilizando color como una lista de 3 dígitos y opacity como flotante, pero la biblioteca necesitaba color como una lista de 4 dígitos con opacidad como 4to dígito. Yo no quiero nombrar una variable de usar y tirar, por lo que esta sintaxis satisfizo mis necesidades:

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

Esto crea una nueva lista para la opacidad sobre la marcha y una nueva lista después de la concatenación, pero que está bien para mis propósitos. Solo quería una sintaxis compacta para extender una lista con un flotante y devolver la lista resultante sin afectar la lista original o float.

Cuestiones relacionadas