¿Cual es la diferencia?
¿Cuáles son las ventajas / desventajas de las tuplas / listas?
list
. ; D
¿Cual es la diferencia?
¿Cuáles son las ventajas / desventajas de las tuplas / listas?
list
. ; D
Respuestas:
Además de que las tuplas son inmutables, también existe una distinción semántica que debería guiar su uso. Las tuplas son estructuras de datos heterogéneas (es decir, sus entradas tienen significados diferentes), mientras que las listas son secuencias homogéneas. Las tuplas tienen estructura, las listas tienen orden.
El uso de esta distinción hace que el código sea más explícito y comprensible.
Un ejemplo sería pares de páginas y números de línea para hacer referencia a ubicaciones en un libro, por ejemplo:
my_location = (42, 11) # page number, line number
Luego puede usar esto como clave en un diccionario para almacenar notas en ubicaciones. Una lista, por otro lado, podría usarse para almacenar múltiples ubicaciones. Naturalmente, es posible que desee agregar o eliminar ubicaciones de la lista, por lo que tiene sentido que las listas sean mutables. Por otro lado, no tiene sentido agregar o eliminar elementos de una ubicación existente, por lo tanto, las tuplas son inmutables.
Puede haber situaciones en las que desee cambiar elementos dentro de una tupla de ubicación existente, por ejemplo, al iterar a través de las líneas de una página. Pero la inmutabilidad de la tupla te obliga a crear una nueva tupla de ubicación para cada nuevo valor. Esto parece inconveniente a primera vista, pero el uso de datos inmutables como este es una piedra angular de los tipos de valor y las técnicas de programación funcional, que pueden tener ventajas sustanciales.
Hay algunos artículos interesantes sobre este tema, por ejemplo, "Las tuplas de Python no son solo listas constantes" o "Comprender las tuplas frente a las listas en Python" . La documentación oficial de Python también menciona esto
"Las tuplas son inmutables y generalmente contienen una secuencia heterogénea ...".
En un lenguaje de tipo estático como Haskell, los valores en una tupla generalmente tienen diferentes tipos y la longitud de la tupla debe ser fija. En una lista, todos los valores tienen el mismo tipo y la longitud no es fija. Entonces la diferencia es muy obvia.
Finalmente, está la nombrada tupla en Python, lo cual tiene sentido porque ya se supone que una tupla tiene estructura. Esto subraya la idea de que las tuplas son una alternativa ligera a las clases e instancias.
collections.namedtuple
que sería mejor llamarlo collections.record
. No tendría sentido intercambiar, digamos, el nombre y la dirección en un registro de cliente; de hecho, hacerlo sería generalmente un error, que la inmutabilidad de la tupla le impide cometer.
What would you do with such a list?
, siempre tiemblo cuando la gente usa la falta de fantasía como argumento. El uso de listas de tipos mixtos funciona muy bien, por ejemplo, para algunas estructuras de datos jerárquicas, donde cada lista se compone de listas secundarias y elementos de valor.
Diferencia entre lista y tupla
Literal
someTuple = (1,2)
someList = [1,2]
Talla
a = tuple(range(1000))
b = list(range(1000))
a.__sizeof__() # 8024
b.__sizeof__() # 9088
Debido al tamaño más pequeño de una operación de tupla, se vuelve un poco más rápido, pero no hay mucho que mencionar hasta que tenga una gran cantidad de elementos.
Operaciones permitidas
b = [1,2]
b[0] = 3 # [3, 2]
a = (1,2)
a[0] = 3 # Error
Eso también significa que no puede eliminar un elemento u ordenar una tupla. Sin embargo, podría agregar un nuevo elemento tanto a la lista como a la tupla con la única diferencia de que, dado que la tupla es inmutable, en realidad no está agregando un elemento pero está creando una nueva tupla, por lo que la identificación de cambiará
a = (1,2)
b = [1,2]
id(a) # 140230916716520
id(b) # 748527696
a += (3,) # (1, 2, 3)
b += [3] # [1, 2, 3]
id(a) # 140230916878160
id(b) # 748527696
Uso
Como una lista es mutable, no se puede usar como clave en un diccionario, mientras que se puede usar una tupla.
a = (1,2)
b = [1,2]
c = {a: 1} # OK
c = {b: 1} # Error
3. Permitted operation
muestra primero el caso de la tupla. Sé que es habitual mostrar el éxito y luego el error, pero eso me molestó por unos momentos.
one_item_list = [a]
, pero one_tuple = (a,)
es la tupla correspondiente. Tenga en cuenta la coma que sigue al nombre de la variable. Pero también tenga en cuenta two_tuple = (a, b)
. Esto me arrojó más de una vez (todavía allí en Python 3).
tuple(sorted(the_unsorted_tuple))
Si saliste a caminar, podrías anotar tus coordenadas en cualquier momento en un (x,y)
tupla.
Si desea registrar su viaje, puede agregar su ubicación cada pocos segundos a una lista.
Pero no podrías hacerlo al revés.
La diferencia clave es que las tuplas son inmutables. Esto significa que no puede cambiar los valores en una tupla una vez que lo haya creado.
Entonces, si necesita cambiar los valores, use una Lista.
Beneficios para las tuplas:
frozenset
o los diversos dict / tree / etc congelados de terceros. tipos, pero ninguno de ellos le permite agregar elementos mutables. (Y, por supuesto, una tupla solo se puede cambiar si todos sus elementos lo son, que se maneja de la manera habitual de EAFP, por d[1, [2]]
lo que aumentará TypeError: unhashable type: 'list'
).
Las listas son mutables; Las tuplas no lo son.
De docs.python.org/2/tutorial/datastructures.html
Las tuplas son inmutables y, por lo general, contienen una secuencia heterogénea de elementos a los que se accede desempacando (ver más adelante en esta sección) o indexando (o incluso por atributo en el caso de las tuplas nombradas). Las listas son mutables, y sus elementos son generalmente homogéneos y se accede iterando sobre la lista.
Se ha mencionado que la diferencia es en gran medida semántica: las personas esperan que una tupla y una lista representen información diferente. Pero esto va más allá de una guía; algunas bibliotecas en realidad se comportan de manera diferente en función de lo que se pasan. Tome NumPy por ejemplo (copiado de otra publicación donde solicito más ejemplos):
>>> import numpy as np
>>> a = np.arange(9).reshape(3,3)
>>> a
array([[0, 1, 2],
[3, 4, 5],
[6, 7, 8]])
>>> idx = (1,1)
>>> a[idx]
4
>>> idx = [1,1]
>>> a[idx]
array([[3, 4, 5],
[3, 4, 5]])
El punto es que, aunque NumPy puede no ser parte de la biblioteca estándar, es una biblioteca importante de Python, y dentro de las listas y tuplas de NumPy hay cosas completamente diferentes.
type(a_list) != type(a_tuple)
, por lo que cualquier ramificación de código de biblioteca basada en type(x)
se comportará de manera diferente
'%d %d' % [2, 3]
es un TypeError
, porque está intentando pasar una lista a la primera %d
y no está pasando ningún valor a la segunda %d
. (Sin embargo, también hay ejemplos contrarios a esto, como max
...)
Las listas son para bucles, las tuplas son para estructuras, es decir "%s %s" %tuple
.
Las listas suelen ser homogéneas, las tuplas suelen ser heterogéneas.
Las listas son de longitud variable, las tuplas son de longitud fija.
Este es un ejemplo de listas de Python:
my_list = [0,1,2,3,4]
top_rock_list = ["Bohemian Rhapsody","Kashmir","Sweet Emotion", "Fortunate Son"]
Este es un ejemplo de tupla de Python:
my_tuple = (a,b,c,d,e)
celebrity_tuple = ("John", "Wayne", 90210, "Actor", "Male", "Dead")
Las listas y tuplas de Python son similares en que ambas son colecciones ordenadas de valores. Además de la diferencia superficial de que las listas se crean con corchetes "[..., ...]" y las tuplas con paréntesis "(..., ...)", la diferencia técnica principal "codificada en sintaxis de Python" entre ellos es que los elementos de una tupla en particular son inmutables, mientras que las listas son mutables (... ¡así que solo las tuplas son hashable y pueden usarse como claves de diccionario / hash!). Esto da lugar a diferencias en cómo se pueden o no se pueden usar (aplicadas a priori por la sintaxis) y diferencias en cómo las personas eligen usarlas (alentadas como 'mejores prácticas', a posteriori, esto es lo que hacen los programadores inteligentes ). La gente da al orden de los elementos.
Para las tuplas, 'orden' no significa nada más que solo una 'estructura' específica para almacenar información. Los valores que se encuentran en el primer campo se pueden cambiar fácilmente al segundo campo, ya que cada uno proporciona valores en dos dimensiones o escalas diferentes. Proporcionan respuestas a diferentes tipos de preguntas y son típicamente de la forma: para un objeto / tema determinado, ¿cuáles son sus atributos? El objeto / sujeto permanece constante, los atributos difieren.
Para las listas, 'orden' significa una secuencia o direccionalidad. El segundo elemento DEBE venir después del primer elemento porque está posicionado en el segundo lugar según una escala o dimensión particular y común. Los elementos se toman como un todo y en su mayoría proporcionan respuestas a una sola pregunta, típicamente de la forma, para un atributo dado, ¿cómo se comparan estos objetos / sujetos? El atributo permanece constante, el objeto / sujeto difiere.
Hay innumerables ejemplos de personas en la cultura popular y programadores que no se ajustan a estas diferencias y hay innumerables personas que podrían usar un tenedor de ensalada como plato principal. Al final del día, está bien y ambos generalmente pueden hacer el trabajo.
Para resumir algunos de los detalles más finos
Similitudes:
Indexación, selección y división : tanto las tuplas como las listas indexan utilizando valores enteros que se encuentran entre paréntesis. Entonces, si desea los primeros 3 valores de una lista o tupla dada, la sintaxis sería la misma:
>>> my_list[0:3]
[0,1,2]
>>> my_tuple[0:3]
[a,b,c]
Comparación y clasificación : dos tuplas o dos listas se comparan por su primer elemento, y si hay un empate, entonces por el segundo elemento, y así sucesivamente. No se presta más atención a los elementos posteriores después de que los elementos anteriores muestran una diferencia.
>>> [0,2,0,0,0,0]>[0,0,0,0,0,500]
True
>>> (0,2,0,0,0,0)>(0,0,0,0,0,500)
True
Diferencias: - A priori, por definición
Sintaxis : las listas usan [], las tuplas usan ()
Mutabilidad : los elementos en una lista dada son mutables, los elementos en una tupla dada NO son mutables.
# Lists are mutable:
>>> top_rock_list
['Bohemian Rhapsody', 'Kashmir', 'Sweet Emotion', 'Fortunate Son']
>>> top_rock_list[1]
'Kashmir'
>>> top_rock_list[1] = "Stairway to Heaven"
>>> top_rock_list
['Bohemian Rhapsody', 'Stairway to Heaven', 'Sweet Emotion', 'Fortunate Son']
# Tuples are NOT mutable:
>>> celebrity_tuple
('John', 'Wayne', 90210, 'Actor', 'Male', 'Dead')
>>> celebrity_tuple[5]
'Dead'
>>> celebrity_tuple[5]="Alive"
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'tuple' object does not support item assignment
Tablas hash (diccionarios) : como las tablas hash (diccionarios) requieren que sus claves sean hash y, por lo tanto, inmutables, solo las tuplas pueden actuar como claves de diccionario, no como listas.
#Lists CAN'T act as keys for hashtables(dictionaries)
>>> my_dict = {[a,b,c]:"some value"}
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'list'
#Tuples CAN act as keys for hashtables(dictionaries)
>>> my_dict = {("John","Wayne"): 90210}
>>> my_dict
{('John', 'Wayne'): 90210}
Diferencias - A posteriori, en uso
Homo versus heterogeneidad de elementos: en general, los objetos de lista son homogéneos y los objetos de tupla son heterogéneos. Es decir, las listas se usan para objetos / temas del mismo tipo (como todos los candidatos presidenciales, o todas las canciones, o todos los corredores), mientras que aunque no es forzado por ellos, mientras que las tuplas son más para objetos heterogéneos.
Bucle contra estructuras: aunque ambos permiten el bucle (para x en my_list ...), solo tiene sentido hacerlo para una lista. Las tuplas son más apropiadas para estructurar y presentar información (% s% s que reside en% s es un% sy actualmente% s% ("John", "Wayne", 90210, "Actor", "Dead"))
Las tuplas y las listas son tipos de secuencia aparentemente similares en Python.
Sintaxis literal
Usamos paréntesis ( ) para construir tuplas y corchetes
[ ]
para obtener una nueva lista. Además, podemos usar llamadas del tipo apropiado para obtener la estructura requerida: tupla o lista.
someTuple = (4,6)
someList = [2,6]
Mutabilidad
Las tuplas son inmutables, mientras que las listas son mutables. Este punto es la base para los siguientes.
Uso de memoria
Debido a la mutabilidad, necesita más memoria para las listas y menos memoria para las tuplas.
Extensible
Puede agregar un nuevo elemento tanto a las tuplas como a las listas con la única diferencia de que se cambiará la identificación de la tupla (es decir, tendremos un nuevo objeto).
Hashing
Las tuplas son hashable y las listas no. Significa que puede usar una tupla como clave en un diccionario. La lista no se puede usar como clave en un diccionario, mientras que se puede usar una tupla
tup = (1,2)
list_ = [1,2]
c = {tup : 1} # ok
c = {list_ : 1} # error
Semántica
Este punto es más sobre las mejores prácticas. Debe usar tuplas como estructuras de datos heterogéneas, mientras que las listas son secuencias homogéneas.
Las listas están destinadas a ser secuencias homogéneas, mientras que las tuplas son estructuras de datos heterogéneas.
Como la gente ya ha respondido aquí que tuples
son inmutables mientras que lists
son mutables, pero hay un aspecto importante del uso de tuplas que debemos recordar
Si tuple
contiene a list
o a dictionary
dentro, se pueden cambiar incluso si el tuple
mismo es inmutable.
Por ejemplo, supongamos que tenemos una tupla que contiene una lista y un diccionario como
my_tuple = (10,20,30,[40,50],{ 'a' : 10})
podemos cambiar el contenido de la lista como
my_tuple[3][0] = 400
my_tuple[3][1] = 500
lo que hace que parezca una nueva tupla
(10, 20, 30, [400, 500], {'a': 10})
también podemos cambiar el diccionario dentro de tupla como
my_tuple[4]['a'] = 500
lo que hará que la tupla general se vea como
(10, 20, 30, [400, 500], {'a': 500})
Esto sucede porque list
y dictionary
son los objetos y estos objetos no están cambiando, sino el contenido al que apunta.
Entonces los tuple
restos son inmutables sin ninguna excepción
El PEP 484 - Sugerencias de tipo dice que los tipos de elementos de a tuple
se pueden escribir individualmente; para que puedas decir Tuple[str, int, float]
; pero a list
, con la List
clase de escritura solo puede tomar un parámetro de tipo: lo List[str]
que sugiere que la diferencia de los 2 es que el primero es heterogéneo, mientras que el segundo es intrínsecamente homogéneo.
Además, la biblioteca estándar usa principalmente la tupla como un valor de retorno de tales funciones estándar donde la C devolvería a struct
.
Como la gente ya ha mencionado las diferencias, escribiré sobre por qué las tuplas.
¿Por qué se prefieren las tuplas?
Optimización de asignación para tuplas pequeñas
Para reducir la fragmentación de la memoria y acelerar las asignaciones, Python reutiliza tuplas antiguas. Si una tupla ya no es necesaria y tiene menos de 20 elementos en lugar de eliminarla permanentemente, Python la mueve a una lista libre.
Una lista gratuita se divide en 20 grupos, donde cada grupo representa una lista de tuplas de longitud n entre 0 y 20. Cada grupo puede almacenar hasta 2 000 tuplas. El primer grupo (cero) contiene solo 1 elemento y representa una tupla vacía.
>>> a = (1,2,3)
>>> id(a)
4427578104
>>> del a
>>> b = (1,2,4)
>>> id(b)
4427578104
En el ejemplo anterior, podemos ver que ayb tienen la misma identificación. Eso es porque inmediatamente ocupamos una tupla destruida que estaba en la lista libre.
Optimización de asignación para listas
Como las listas se pueden modificar, Python no usa la misma optimización que en las tuplas. Sin embargo, las listas de Python también tienen una lista libre, pero solo se usa para objetos vacíos. Si GC elimina o recopila una lista vacía, puede reutilizarla más tarde.
>>> a = []
>>> id(a)
4465566792
>>> del a
>>> b = []
>>> id(b)
4465566792
Fuente: https://rushter.com/blog/python-lists-and-tuples/
¿Por qué las tuplas son más eficientes que las listas? -> https://stackoverflow.com/a/22140115
Una cita de dirección de la documentación en 5.3. Tuplas y Secuencias :
Aunque las tuplas pueden parecer similares a las listas, a menudo se usan en diferentes situaciones y para diferentes propósitos. Las tuplas son inmutables y generalmente contienen una secuencia heterogénea de elementos a los que se accede desempacando (ver más adelante en esta sección) o indexando (o incluso por atributo en el caso de las tuplas nombradas). Las listas son mutables , y sus elementos son generalmente homogéneos y se accede iterando sobre la lista.
En primer lugar, ambos son objetos no escalares (también conocidos como objetos compuestos) en Python.
+
(por supuesto, se creará una nueva tupla)(3,) # -> (3)
lugar de(3) # -> 3
[3]
new_array = origin_array[:]
[x**2 for x in range(1,7)]
te da
[1,4,9,16,25,36]
(no legible)El uso de la lista también puede causar un error de alias (dos rutas distintas que apuntan al mismo objeto).
Las listas son mutables y las tuplas son inmutables. Solo considera este ejemplo.
a = ["1", "2", "ra", "sa"] #list
b = ("1", "2", "ra", "sa") #tuple
Ahora cambie los valores de índice de la lista y la tupla.
a[2] = 1000
print a #output : ['1', '2', 1000, 'sa']
b[2] = 1000
print b #output : TypeError: 'tuple' object does not support item assignment.
Por lo tanto, demostró que el siguiente código no es válido con la tupla, porque intentamos actualizar una tupla, lo cual no está permitido.
La lista es mutable y las tuplas son inmutables. La principal diferencia entre mutable e inmutable es el uso de memoria cuando intenta agregar un elemento.
Cuando crea una variable, se asigna algo de memoria fija a la variable. Si es una lista, se asigna más memoria de la que realmente se usa. Por ejemplo, si la asignación de memoria actual es de 100 bytes, cuando desee agregar el byte 101, tal vez se asignarán otros 100 bytes (en total 200 bytes en este caso).
Sin embargo, si sabe que no agrega elementos nuevos con frecuencia, debe usar tuplas. Tuples asigna el tamaño exacto de la memoria necesaria y, por lo tanto, ahorra memoria, especialmente cuando utiliza grandes bloques de memoria.