2010-04-29 19 views
9

Disculpen si esto no tiene ningún sentido, ¡soy muy nuevo en Python!Crear una lista en Python: ¿algo furtivo?

De las pruebas en un intérprete, puedo ver que list() y [] ambos producen una lista vacía:

>>> list() 
[] 
>>> [] 
[] 

Por lo que he aprendido hasta ahora, la única manera de crear un objeto es llamar a su constructor (__init__), pero no veo que esto ocurra cuando escribo []. Entonces, al ejecutar [], ¿Python lo mapea a una llamada al list()?

+0

Gracias a todos los contestadores, eso realmente resolvió las cosas. – GlenCrawford

Respuesta

6

No, Python no llama list(), ya que podría afectar a qué tipo [] crea mediante la asignación a la lista, que no puedes:

>>> import __builtin__ 
>>> __builtin__.list = set 
>>> list() 
set([]) 
>>> [] 
[] 

[] es sintaxis para crear una lista. Es un tipo incorporado y tiene una sintaxis especial, como dicts y strings y ints y floats y muchos otros tipos.

casos Creación de tipos pueden también puede hacer llamando al tipo, al igual que list() - que a su vez llamar constructor y inicializador de tipo para usted. Llamar al inicializador (__init__) directamente hace no crear una nueva instancia del tipo. Llamar al constructor (__new__) sí, pero no debería llamarlo directamente.

13

Esos dos constructos se manejan de manera muy diferente:

>>> import dis 
>>> def f(): return [] 
... 
>>> dis.dis(f) 
    1   0 BUILD_LIST    0 
       3 RETURN_VALUE   
>>> def f(): return list() 
... 
>>> dis.dis(f) 
    1   0 LOAD_GLOBAL    0 (list) 
       3 CALL_FUNCTION   0 
       6 RETURN_VALUE   
>>> 

La forma [] construye una lista con el código de operación BUILD_LIST, mientras que la forma list() llama constructor del objeto list.

4

empecé a aprender Python ayer .... supongo que tendría que decir que es internamente mapeados

>>> a = [] 
>>> type(a) 
<type 'list'> 
>>> a = list() 
>>> type(a) 
<type 'list'> 
+1

+1 para bucear y responder preguntas en su segundo día de uso de Python. – PaulMcG

4

Además de las otras respuestas, desde el Language Reference:

Una lista pantalla es una serie de expresiones posiblemente vacía entre corchetes:

list_display  ::= "[" [expression_list | list_comprehension] "]" 
... 

Una lista pantalla produce un nuevo objeto de lista.

No menciona explícitamente cómo se implementa el "rendimiento de un nuevo objeto de lista". Bien podría ser una llamada al constructor list(), como usted mencionó. O tal vez las listas, siendo tan elementales, reciban un trato especial, y list() en realidad está asignado a algo completamente diferente.

De cualquier manera, [] luego, no se asigna a una llamada al constructor del tipo llamado __builtins__.list, debido a la redefinición de ese tipo todavía causa [] para devolver una lista real, como otros han demostrado que responden.

3

Python, como la mayoría de los lenguajes de programación, tiene algo llamado literales, lo que significa que la sintaxis especial se puede utilizar para escribir algunos de los tipos de valores más importantes. Muy poco de esto es necesario, pero facilita el uso de Python para que podamos escribir literales.

>>> 0 
0 
>>> int() 
0 
>>> 5 
5 
>>> int('5') # I'm using a string literal here though! 
5 
>>> 0.0 
0.0 
>>> float() 
0.0 
>>> "" 
'' 
>>> str() 
'' 
>>> u"" 
u'' 
>>> unicode() 
u'' 
>>>() 
() 
>>> tuple() 
() 
>>> {} 
{} 
>>> dict() 
{}  

Cuando hacemos nuestros propios tipos (clases), que crear instancias de ellos utilizando sus constructores, como list para las listas. Cuando usamos literales, es algo así como azúcar sintáctico para llamar al list, pero en realidad llama a las mismas cosas básicas detrás de la escena.

Cuestiones relacionadas