tupla - manejo de listas en python
¿Cuál es la diferencia entre el corchete y las notaciones de puntos en Python? (4)
Vengo de un fondo de JavaScript (donde se puede acceder a las propiedades mediante notación tanto .
Como []
), así que, por favor, perdóneme, pero ¿cuál es exactamente la diferencia entre las dos en Python?
Desde mi experimentación, se ve que []
siempre debe usarse, tanto para obtener el índice de una list
o un set
como para obtener el valor de una determinada clave en un dictionary
. ¿Es correcto y, de no ser así, cuándo usas a .
en Python?
El operador punto se utiliza para acceder a los atributos de cualquier objeto. Por ejemplo, un número complejo
>>> c = 3+4j
tiene (entre otros) los dos atributos real
e imag
:
>>> c.real
3.0
>>> c.imag
4.0
Además de esos, tiene un método, conjugate()
, que también es un atributo:
>>> c.conjugate
<built-in method conjugate of complex object at 0x7f4422d73050>
>>> c.conjugate()
(3-4j)
La notación de corchete se usa para acceder a los miembros de una colección, ya sea por clave en el caso de un diccionario u otro mapeo:
>>> d = {''a'': 1, ''b'': 2}
>>> d[''a'']
1
... o por índice en el caso de una secuencia como una lista o cadena:
>>> s = [''x'', ''y'', ''z'']
>>> s[2]
''z''
>>> t = ''Kapow!''
>>> t[3]
''o''
Estas colecciones también, por separado, tienen atributos:
>>> d.pop
<built-in method pop of dict object at 0x7f44204068c8>
>>> s.reverse
<built-in method reverse of list object at 0x7f4420454d08>
>>> t.lower
<built-in method lower of str object at 0x7f4422ce2688>
... y nuevamente, en los casos anteriores, estos atributos son métodos.
Si bien todos los objetos tienen algunos atributos, no todos los objetos tienen miembros. Por ejemplo, si tratamos de usar la notación de corchetes para acceder a un miembro de nuestro número complejo c
:
>>> c[0]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: ''complex'' object is not subscriptable
... obtenemos un error (lo cual tiene sentido, ya que no hay una forma obvia de que un número complejo tenga miembros).
Es posible definir cómo []
y .
acceda al trabajo en una clase definida por el usuario, usando los métodos especiales __getitem__()
y __getattr__()
respectivamente. Explicar cómo hacerlo está más allá del alcance de esta pregunta, pero puede leer más sobre esto en el tutorial de Python .
En realidad, Python usa los corchetes para encerrar una clave. Para las listas, este es un índice entero (sin signo) o un corte, mientras que para los dictados este es un objeto (transitable) como cadena, tupla, etc. o incluso un entero (singe y sin signo). Esto es directo a muchos otros lenguajes que usan una sintaxis similar o incluso idéntica.
El .
se usa para acceder a los miembros de un objeto, al igual que para C ++, C, Java, JavaScript, etc. Sería bastante simple escribir una clase de diccionario que permita usar la sintaxis de puntos para acceder a sus elementos. Sin embargo, para esto, las claves tienen que ser un identificador de Python válido (letter { letter | digit |
_ }
. Sin embargo, esto no es muy común.
Un conjunto no admite indexación, ya que no está ordenado internamente y no hay relación entre una "clave" y un "valor". Para una lista, no "obtiene el índice", pero sí "obtiene el valor de un índice". Para un dict esto es similar, pero el "índice" es más flexible. Sin embargo, el dict no permite cortar y está (como el conjunto) desordenado.
Sidenote: Python usa un dict interno para que un objeto organice sus miembros. Solo prueba en la consola:
class MyClass:
def myfunc(self):
pass
print(MyClass.__dict__)
Obtendrás todos los atributos (nombre: valor) de esta clase. Tenga en cuenta la entrada de myfunc
.
.
se usa para acceder a los atributos (incluidos los métodos). []
se utiliza para acceder a lo que se llama "elementos", que normalmente son los contenidos de varios tipos de objetos contenedores.
JavaScript no distingue estas dos cosas, pero Python sí. Tiene razón en que []
se usa para acceder a los datos en una lista o dict. .
se usa, por ejemplo, para acceder a métodos como list.append
y dict.update
. También se usa para acceder a otros datos en otros tipos de objetos; por ejemplo, los objetos de expresiones regulares compilados tienen un atributo de pattern
contiene el patrón de expresiones regulares (lo accedería con rx.pattern
).
En general, la convención es que []
se usa para el almacenamiento de datos de "final abierto" en el que no se sabe por adelantado cuánto o qué tipo de datos contendrá el objeto; .
es más comúnmente utilizado para datos específicos que el objeto tiene "por naturaleza" y que se accede con un nombre predefinido. Por ejemplo, el solo hecho de saber que algo como una lista no le dice qué contiene (para lo cual usa []
), pero sí le dice que puede anexarlo (y acceder al método de agregar que usa).
La otra gran diferencia entre Python y JavaScript a este respecto es que en Python, el comportamiento de ambos .
y []
puede ser personalizado por el objeto. Entonces obj.foo
u obj[foo]
pueden hacer algo especial si obj
es un objeto que define su propio comportamiento para ellos. Hay varios tipos personalizados que hacen uso de esto para sus propios fines.
[]
es el índice de un contenedor, como una lista o un diccionario.
.
es el miembro de un objeto y módulos. Puede ser un método, datos de miembro o atributo.
>>> xs = [1, 7, 3, 4, 5, 4, 3, 4, 1]
>>> xs.count(4)
3
>>> xs[1]
7