Resumen:

  • En una función interna, si no se modifica la variable global, se puede acceder a la variable global.
  • En una función interna, si se modifica una variable global del mismo nombre, Python la considera una variable local.
  • Si se llama al nombre de la variable (como print sum) antes de modificar la variable global del mismo nombre en la función interna, se genera UnboundLocalError.

La variable sum definida en el programa es una variable global, pero no hay una definición de sum en la función. Según las reglas de Python para acceder a variables locales y globales: cuando se busca una variable, Python primero la busca en el ámbito local; si no la encuentra en el ámbito local, entonces la busca en las variables globales; si no la encuentra, lanza una excepción (NameError o UnboundLocalError, dependiendo de la versión de Python).

Si una función interna hace referencia a una variable del mismo nombre de una función externa o a una variable global, y además modifica esta variable, entonces Python la considerará una variable local. Y debido a que no hay definición ni asignación de sum en la función, se produce un error.

Como se ve en los siguientes dos programas, acceder o modificar una variable global por separado no genera errores~

Acceder a la variable global:

#!/usr/bin/python
# -*- coding: UTF-8 -*-

import sys

sum=5
def add(a=1,b=3):
    print a,b
    print sum   #仅仅访问 
add(4,8)
print sum

El resultado de salida es:

4 8
5
5

Si se modifica la variable global del mismo nombre, se considera una variable local:

#!/usr/bin/python
# -*- coding: UTF-8 -*-

import sys
sum=5
def add(a=1,b=3):
    print a,b
     #内部函数有引用外部函数的同名变量或者全局变量,并且对这个变量有修改.那么python会认为它是一个局部变量
    sum=b+a #在函数内部修改
    print sum
add(4,8)

El resultado de salida es:

4 8
12

El siguiente programa dará error porque "si una función interna hace referencia a una variable del mismo nombre de una función externa o a una variable global, y modifica esta variable, entonces Python la considerará una variable local; y como no hay definición ni asignación de sum en la función, se produce un error":

#!/usr/bin/python
# -*- coding: UTF-8 -*-

import sys
sum=5
def add(a=1,b=3):
    print a,b
    print sum  #内部函数引用同名变量,并且修改这个变量。python会认为它是局部变量。因为在此处print之前,没有定义sum变量,所以会报错(建议与情况一比较,备注:此处只是比上例先print sum)
    sum=b+a
    print sum
add(4,8)
print sum

Mensaje de error:

4 8
Traceback (most recent call last):
...
...
...
UnboundLocalError: local variable 'sum' referenced before assignment

Cuando en un programa se necesita acceder a una variable global y modificar su valor, se puede usar:globalLa palabra clave para declarar en la función que esta variable es global.

#!/usr/bin/python
# -*- coding: UTF-8 -*-

import sys

sum=5
print '改变之前:sum=',sum
def add(a=1,b=3):
    global sum
    print 'add 函数中:sum=',sum
    sum=b+a
    print '函数中改变之后:sum= ',sum
add(4,8)
print '改变之后 sum=',sum

El resultado de salida es:

改变之前:sum= 5
add 函数中:sum= 5
函数中改变之后:sum=  12
改变之后 sum= 12

Dirección original: https://blog.csdn.net/my2010sam/article/details/17735159