2012-01-28 36 views
37

tenga en cuenta los dos fragmentos de código (nótese la diferencia entre la cadena y el número entero):¿Por qué un [:] = 1 es fundamentalmente diferente de un [:] = '1'?

a = [] 
a[:] = '1' 

y

a = [] 
a[:] = 1 

En el primer caso es a['1']. En el segundo, obtengo el error TypeError: can only assign an iterable. ¿Por qué el uso de '1' sobre 1 sería fundamentalmente diferente aquí?

+2

¿Las cotizaciones significan algo para usted? ¿Podría incluir las palabras "Cadena" y "Entero" en su pregunta para aclarar la distinción entre "1" y "1"? –

Respuesta

79

La asignación a una división requiere un iterable en el lado derecho.

'1' es iterable, mientras que 1 no lo es. Considere lo siguiente:

In [7]: a=[] 

In [8]: a[:]='abc' 

El resultado es:

In [9]: a 
Out[9]: ['a', 'b', 'c'] 

Como se puede ver, la lista se hace cada personaje de la cadena como un elemento separado. Esto es una consecuencia del hecho de que iterar sobre una cadena produce sus caracteres.

Si desea reemplazar una serie de elementos a 's con un solo escalar, simplemente envuelva el escalar en un iterable de algún tipo:

In [11]: a[:]=(1,) # single-element tuple 

In [12]: a 
Out[12]: [1] 

Esto también se aplica a las cadenas (siempre que la cadena es de ser tratado como un único elemento y no como una secuencia de caracteres):

In [17]: a[:]=('abc',) 

In [18]: a 
Out[18]: ['abc'] 
+0

También podría omitir los corchetes: 'a [:] = 1,' funciona igual de bien. Aunque es menos detallado, supongo. – TyrantWave

+0

@TyrantWave Creo que quiso decir * parens *, no corchetes. Y para otros usuarios, los parens no son constructores de tuplas, es la coma. Consulte http://python.net/~goodger/projects/pycon/2007/idiomatic/handout.html#more-about-tuples – Edwin

+0

Lo mismo es simplemente diferente: P – TyrantWave

2

'1' es una cadena, pero es iterable. Es como una lista de personajes. a[:]='1' reemplaza el contenido de la lista a con el contenido de la cadena '1'. Pero 1 es un número entero.

Python no cambia el tipo.

Ejemplo:

print bool(1=='1') # --> False 
Cuestiones relacionadas