Python tuple vs generador

Tengo un problema para entender por qué una de las siguientes líneas devuelve el generador y otra tupla.

¿Cómo exactamente y por qué se crea un generador en la segunda línea, mientras que en la tercera se produce una tupla?

sample_list = [1, 2, 3, 4] generator = (i for i in sample_list) tuple_ = (1, 2, 3, 4) print type(generator)  print type(tuple_)  

Es porque la tupla es un objeto inmutable y cuando bash desempaquetar la lista dentro de () , no puede crear la tupla ya que tiene que cambiar la tupla.

Puedes imaginar las tuplas como creadas cuando codificas los valores, mientras que los generadores se crean donde puedes crear los objetos.

Esto funciona ya que no hay manera (1,2,3,4) podría ser un generador. No hay nada que generar allí, solo especificaste todos los elementos, no una regla para obtenerlos.

Para que su generator sea ​​una tupla, la expresión (i for i in sample_list) tendría que ser una comprensión de tupla. No hay forma de tener una comprensión de la tupla, ya que las comprensiones requieren un tipo de datos mutable.

Por lo tanto, la syntax de lo que debería haber sido una comprensión de la tupla se ha reutilizado para los generadores.

Los paréntesis se usan para tres cosas diferentes: agrupación, literales de tuplas y llamadas a funciones. Compara (1 + 2) (un número entero) y (1, 2) (una tupla). En la asignación del generator , los paréntesis son para agrupar; en la asignación de tuple , los paréntesis son un literal de tupla. Los paréntesis representan un literal de tupla cuando contienen una coma y no se usan para una llamada de función.