Ver Mensaje Individual
  #7 (permalink)  
Antiguo 21/04/2014, 15:23
Principe_Azul
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Bugs y errores de diseño del lenguaje Python

Hola nuevamente, creo que todavía no has leído esa página, a ver, para que nos entiendamos mejor, debés si o si leer sobre la vida y muerte de una variable, en uno de los ejemplos de la página que te pasé, explica exactamente lo mismo que yo te expliqué, además también hace lo mismo que yo hice, asignar una variable global dentro de la función.

Cita:
@Principe_Azul : estas equivocado..... no hay intencionalidad de pasar ninguna variable (x) como parametro a la funcion : f(x) .....
No amigo, el que está equivocado sos vos, comprende que en Python esó que vos intentás hacer está prohibido, si leyeras entenderías que eso es así.
Y si, hay que pasar parámetros dentro de la función o asignar la variable x dentro de la función como global
Tratá de comprender y entender que esto es así, no se puede trabajar de la manera que vos querés.

Cita:
En una epoca intente hacer lo mismo en el foro de PHP pero recibí bastantes agresiones de moderadores y demas usuarios......ojala aca si haya apoyo de divulgar las fallas del lenguaje para estar prevenidos ante un fallo inexplicable en nuestro
Seguís pensando que es una falla, entendé no es una falla, la falla está en vos, Python no trabaja como uno quiere, sino como lo crearon.
Este Foro es muy tranquilo y veo a personas trabajar en equipo, no creo que alguien te agreda, es más yo amablemente trato de explicarte como funciónan las variables en Python, pero no quieres pensar ni entender como es en realidad el proceso de modificación de una variable dentro de una función.

Por si no has leído la página que te pasé, te dejo una parte de la misma en donde explican que lo que vos querés hacer, está prohibido y de que manera se lo debe hacer eticamente:


Las variables globales tienen la particularidad de que también son visibles dentro de la función:


Código:
# Ejemplo 6

def cajanegra():
    c = 3
    print(a)
    print(b)
    print(c)

a = 1
b = 2
cajanegra()

>>> 
1
2
3
Sin embargo, todo intento de modificar una variable global desde dentro de una función mediante una nueva asignación fracasa, como podemos comprobar en el ejemplo 7:


Código:
# Ejemplo 7

def cajanegra():
    c = 3
    print(a)
    b = 5
    print('La variable b dentro de la función vale', b)
    print(c)

a = 1
b = 2
cajanegra()
print('La variable b fuera de la función sigue valiendo', b)

>>> 
1
La variable b dentro de la función vale 5
3
La variable b fuera de la función sigue valiendo 2
Lo importante a comprender es que, desde el preciso momento en el que una variable recibe una asignación dentro de una función, pasa a ser calificada como local. Cuando eso ocurre, la variable tiene una visibilidad limitada al cuerpo de la función y deja de ser considerada como global si ya existía el nombre en el ámbito exterior. Por eso, en el ejemplo, la variable a es global, mientras que b y c son locales.

Dentro de una función, la misma variable no puede ser en unos momentos global y en otros local. Si hay una asignación, aunque sea posterior a su uso como variable global, la variable será considerada local y se producirá un error:


Código:
# Ejemplo 8

def cajanegra():
    c = 3
    print(b)
    b = 5

a = 1
b = 2
cajanegra()

>>> 
Traceback (most recent call last):
  File "C:\Users\Javier\Dropbox\pythonprad\pruebas\probando.py", line 45, in <module>
    cajanegra()
  File "C:\Users\Javier\Dropbox\pythonprad\pruebas\probando.py", line 40, in cajanegra
    print(b)
UnboundLocalError: local variable 'b' referenced before assignment
El mensaje es concluyente: la variable b ha sido referenciada antes de haber recibido una asignación, algo prohibido en Python. Si no hubiese existido la asignación en la tercera línea del cuerpo de cajanegra(), b hubiese sido considerada una variable global y el codigo sería válido. Sin embargo, la asignación hace que b se trate como local, invalidando su rol global.

En numerosas ocasiones puede resultar conveniente no solo poder acceder a una variable global desde dentro de una función, sino poder cambiar su valor mediante una nueva asignación. Para lograr esto, hay que calificar la variable externa dentro de la función empleando la palabra global.


Código:
# Ejemplo 9

def cajanegra():
    c = 3
    global b
    b = 5
    print('Dentro de la función b vale', b)

a = 1
b = 2
cajanegra()
print('Fuera de la función b también vale', b)


>>> 
Dentro de la función b vale 5
Fuera de la función b también vale 5
Al calificar b como global dentro de la función estamos indicando que las asignaciones posteriores de esa variable se realizarán en un ámbito global en vez de local, modificando así el valor externo.

Hay que usar las variables globales con precaución. Permitir a las funciones que modifiquen nuestras variables externas es una práctica que puede dificultar la localización de errores cuando las cosas no funcionan como debieran. Sin embargo, son muy útiles para almacenar información de estado que luego podrá recuperarse al invocar nuevamente la función u otra diferente. En el ejemplo siguiente, utilizamos la variable global suma para retener el efecto de cada invocación a la función:


Código:
# Ejemplo 10

def sumar5():
    global suma
    suma = suma + 5
    print('La nueva suma es', suma)

suma = 0
sumar5()
sumar5()
sumar5()

>>> 
La nueva suma es 5
La nueva suma es 10
La nueva suma es 15
Cada invocación a sumar5() agrega cinco al valor de suma. La variable suma ha sido declarada como global dentro de la función para poder actualizar el valor externo, que será utilizado nuevamente al volver a llamar a la función.

---- Info extraída de http://elclubdelautodidacta.es/wp/20...-una-variable/ ----

Bueno compañero Italico, he sido lo más amable y te he tratado de explicar lo mejor posible, te he puesto la página en donde explican porque da error lo que vos intentás hacer y que eso está prohibido en Python, también te explican como hacerlo de manera correcta, además te he puesto la explicación aquí mismo y hasta con códigos de ejemplos que se observa en esa web.

Yo sólo intento ayudarte de la mejor manera, este un Foro para ayudarnos entre todos, he puesto mi granito de arena.

Que tengas buenas tardes.

Última edición por Principe_Azul; 21/04/2014 a las 15:30