Recordar el valor de la matriz después de la llamada a la función

Si escribo esto:

c = [] def cf(n): c = range (5) print c if any((i>3) for i in c) is True: print 'hello' cf(1) print c 

Entonces me sale:

 [1, 2, 3, 4] hello [] 

Soy realmente nuevo en la progtwigción, así que explícalo de manera simple, pero ¿cómo evito que Python olvide qué es c después de que la función haya finalizado? Pensé que podría arreglarlo definiendo c antes de la función, pero obviamente c es diferente a la creada solo para el bucle de función.

En mi ejemplo, obviamente podría escribir:

 c = range (5) def cf(n) 

Pero el progtwig que estoy tratando de escribir es más como este:

 b = [blah] c = [] def cf(n): c = [transformation of b] if (blah) is True: 'loop' cf else: cf(1) g = [transformation of c that produces errors if c is empty or if c = b] 

Así que no puedo definir c fuera de la función.

En Python, puedes leer variables globales en funciones, pero no puedes asignárselas de forma predeterminada. la razón es que cuando Python encuentra c = creará una variable local. Por lo tanto, para asignar a una global, necesita especificar explícitamente que está asignando a una variable global.

Así que esto funcionará, por ejemplo:

 c = [1,2,3] def cf(): print(c) # it prints [1,2,3], it reads global c 

Sin embargo, esto no funciona como usted esperaría:

 c = [1,2,3] def cf(): c = 1 # c is local here. print(c) # it prints 1 cf() print(c) # it prints [1,2,3], as its value not changed inside cf() 

Así que para que c sea igual, necesitas:

 c = [1,2,3] def cf(): global c c = 1 # c is global here. it overwrites [1,2,3] print(c) # prints 1 cf() print(c) # prints 1. c value was changed inside cf() 

Para resumir algunas de estas respuestas, tiene 3 opciones básicas:

  1. Declara la variable como global en la parte superior de tu función
  2. Devuelve la instancia local de la variable al final de tu función
  3. Pasa la variable como argumento a tu función.

También puede pasar la matriz c a la función después de declararla. Como la matriz es un argumento de función, la c pasa se modificará siempre y cuando no usemos una sentencia = . Esto se puede lograr de esta manera:

 def cf(n, c): c.extend(range(5)) print c if any((i>3) for i in c) is True: print 'hello' if __name__ == '__main__': c = [] cf(1, c) print c 

Para una explicación de esto vea esto

Esto es preferible a la introducción de variables globales en su código (lo que generalmente se considera una mala práctica). árbitro

Prueba esto

 c = [] def cf(n): global c c = range (5) print c if any((i>3) for i in c) is True: print 'hello' cf(1) print c 

Si desea que su función modifique c , hágala explícita, es decir, su función debería devolver el nuevo valor de c . De esta manera evitas los efectos secundarios no deseados:

 def cf(n, b): """Given b loops n times ... Returns ------ c: The modified value """ c = [transformation of b] ... return c # <<<<------- This c = cf(1)