Итог:

  • Внутренняя функция: может обращаться к глобальным переменным, не изменяя их
  • Внутренняя функция: если изменяется глобальная переменная с тем же именем, Python рассматривает её как локальную переменную
  • Вызов имени переменной (например, print sum) перед изменением одноимённой глобальной переменной во внутренней функции вызывает Unbound-LocalError

Переменная sum, заданная в программе, является глобальной переменной, но в функции нет определения sum. Согласно правилам Python для доступа к локальным и глобальным переменным: при поиске переменной Python сначала выполняет поиск в локальной области видимости. Если переменная не найдена в локальной области видимости, Python ищет эту переменную среди глобальных переменных. Если она не найдена, выбрасывается исключение (NAMEERROR или Unbound-LocalError, в зависимости от версии Python).

Если внутренняя функция ссылается на переменную с тем же именем из внешней функции или на глобальную переменную и изменяет эту переменную, Python будет рассматривать её как локальную переменную. Кроме того, поскольку в функции нет определения или присваивания sum, сообщается об ошибке.

Из следующих двух программ простое обращение к глобальной переменной или её изменение не приводит к ошибке~

Обращение к глобальной переменной:

#!/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

Результат вывода:

4 8
5
5

Изменение глобальной переменной с тем же именем трактуется как локальная переменная:

#!/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)

Результат вывода:

4 8
12

Следующая программа выдаст ошибку, потому что «если внутренняя функция ссылается на одноимённую переменную из внешней функции или на глобальную переменную и изменяет эту переменную, то Python будет рассматривать её как локальную переменную, а поскольку в функции нет определения или присваивания sum, сообщается об ошибке:»

#!/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

Сообщение об ошибке:

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

Когда в программе нужно обратиться к глобальной переменной и изменить её значение, можно использовать: ключевое слово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

Результат вывода:

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

Исходный URL: https://blog.csdn.net/my2010sam/article/details/17735159