¿Por qué la variable todavía está disponible después de ejecutar la función? -- python camp Relacionados El problema

Why is the variable still available after the function is executed?


1
vote

problema

Español

Estoy tratando de entender el alcance aquí un poco mejor.

  def f1():     a = 1     def g1(X):         return X+a     return g1  def f2():     a = 1     def g2(X):         return X+1     return g2  g1 = f1() print g1(4) g2 = f2() print g2(4) # both give 5 as you'd expect   

¿Mi problema es que no es a destruido? ¿En qué alcance está disponible? Mi entendimiento general fue que en el segundo caso de f2 A definitivamente no está disponible una vez que la función regresa. De esta manera, por ejemplo, si tiene matrices gigantes o variables en términos de memoria una vez que la función vuelve, ya no son más.

¿Qué pasa aquí?

Editar:

es b siempre disponible aquí?

  def f1():     a = 1     b = 1     def g1(X):         return X+a     return g1   
Original en ingles

I'm trying to understand scope here a bit better.

def f1():     a = 1     def g1(X):         return X+a     return g1  def f2():     a = 1     def g2(X):         return X+1     return g2  g1 = f1() print g1(4) g2 = f2() print g2(4) # both give 5 as you'd expect 

My problem is that isn't a destroyed? In which scope is it available? My general understanding was that in the second case of f2 a is definitely not available once the function returns. This way for example if you have giant arrays or variables in terms of memory once the function returns they're no more.

What happens here?

EDIT:

Is b ever available here?

def f1():     a = 1     b = 1     def g1(X):         return X+a     return g1 
  
 
 

Lista de respuestas

5
 
vote
vote
La mejor respuesta
 

Si una función contiene otra función, y la función interna contiene referencias a variables en la función exterior, y la función interna todavía está "viva" después de que finaliza la función exterior (es decir, se devuelve o se crea una referencia para de alguna manera. ), se crea un cierre, que "ahorra" esas variables, haciéndolas a disposición de la función interna cuando se llama.

En su segundo ejemplo, b6 no está disponible, porque la función interna g1 no lo hace referencia, por lo que no se guarda en el cierre.

 

If a function contains another function, and the inner function contains references to variables in the outer function, and the inner function is still "alive" after the outer function ends (i.e., it is returned or a reference is somehow created to it), a closure is created, which "saves" those variables, making them available to the inner function when it is called.

In your second example, b is not available, because the inner function g1 does not reference it, so it is not saved in the closure.

 
 
   
   

Relacionados problema

55  Vistas de clase en Django  ( Class views in django ) 
django Ver puntos a una función, lo que puede ser un problema si quieres cambiar solo un poco de funcionalidad. Sí, podría tener un millón de argumentos de ...

62  Sistema de integración continua para una base de código Python  ( Continuous integration system for a python codebase ) 
Estoy empezando a trabajar en un proyecto de hobby con una base de código python y me gustaría configurar alguna forma de integración continua (es decir, ej...

77  Procesamiento XML en Python [cerrado]  ( Xml processing in python ) 
cerrado . Esta pregunta es basada en opinión . Actualmente no está aceptando respuestas. ¿...

49  Obtener una vista previa JPEG de un PDF en Windows?  ( Get a preview jpeg of a pdf on windows ) 
Tengo una aplicación multiplataforma (Python) que necesita generar una vista previa de JPEG de la primera página de un PDF. en la Mac estoy desplazando SIP...

51  Usando 'in' para que coincida con un atributo de los objetos de Python en una matriz  ( Using in to match an attribute of python objects in an array ) 
No recuerdo si estaba soñando o no, pero parece que me recuerdo que hay una función que permitió algo como, foo in iter_attr(array of python objects, attri...

682  Agregar un método a una instancia de objeto existente  ( Adding a method to an existing object instance ) 
He leído que es posible agregar un método a un objeto existente (es decir, no en la definición de clase) en Python. Entiendo que no siempre es bueno hacerlo...

39  Python y MySQL  ( Python and mysql ) 
Puedo conseguir que Python funcione con PostgreSQL, pero no puedo hacer que funcione con MySQL. El problema principal es que, en la cuenta de alojamiento comp...

536  ¿Cómo uso IterTools.Groupby ()?  ( How do i use itertools groupby ) 
No he podido encontrar una explicación comprensible de cómo usar realmente la función itertools.groupby()644 de Python. Lo que estoy tratando de hacer es es...

41  ¿Cómo puedo encontrar la ruta completa a una fuente de su nombre de visualización en una Mac?  ( How can i find the full path to a font from its display name on a mac ) 
Estoy usando la API de JavaScript de Photoshop para encontrar las fuentes en un PSD determinado. Dado un nombre de fuente devuelto por la API, quiero encont...

50  CX_ORACE: ¿Cómo lo hago en un conjunto de resultados?  ( Cx oracle how do i iterate over a result set ) 
Hay varias formas de iterar sobre un conjunto de resultados. ¿Cuál es la compensación de cada uno? ...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos