Итог:
- Внутренняя функция: может обращаться к глобальным переменным, не изменяя их
- Внутренняя функция: если изменяется глобальная переменная с тем же именем, 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