概述
Python 中的变量不需要声明。每个变量在使用前都必须赋值,变量赋值以后该变量才会被创建。在 Python 中,变量就是变量,它没有类型,我们所说的"类型"是变量所指的内存中对象的类型。 在Python程序中创建、改变、查找变量名时,都是在一个保存变量名的空间中进行,我们称之为命名空间,也被称之为作用域。python的作用域是静态的,在源代码中变量名被赋值的位置决定了该变量能被访问的范围。即Python变量的作用域由变量所在源代码中的位置决定。
作用域分类
Python 的变量名解析机制也称为 LEGB 法则
- L:local,局部作用域,即函数中定义的变量;
- E:enclosing,嵌套的父级函数的局部作用域,即包含此函数的上级函数的局部作用域,但不是全局的;
- G:globa,全局变量,就是模块级别定义的变量;
- B:built-in,内置作用域,系统固定模块里面的变量,比如int, bytearray等
规则顺序: L –> E –> G –> B。
在局部找不到,便会去局部外的局部找(嵌套作用域),再找不到就会去全局找,再者去内置中找。
#!/usr/bin/python
# -*- coding: UTF-8 -*-
x = int(4.9) # int built-in
g_data = 3 # global
def outer():
e_data = 2 # enclosing
def inner():
l_data = 1 # local
if __name__ == "__main__":
print g_data
outer()
当然,local和enclosing是相对的,enclosing变量相对上层来说也是local。
全局和局部作用域
定义在函数内部的变量拥有一个局部作用域,定义在函数外的拥有全局作用域。局部变量只能在其被声明的函数内部访问,而全局变量可以在整个程序范围内访问。调用函数时,所有在函数内声明的变量名称都将被加入到作用
#!/usr/bin/python
# -*- coding: UTF-8 -*-
g_sum_data = 0 # 这是一个全局变量
# 可写函数说明
def sum( arg1, arg2 ):
#返回2个参数的和."
g_sum_data = arg1 + arg2 # total在这里是局部变量.
print ("local : ", g_sum_data)
if __name__ == "__main__":
#调用sum函数
sum( 10, 20 )
print ("global : ", g_sum_data)
输出结果如下:
函数sum中的g_sum_data是一个全新的局部变量,跟开头处的全局变量指向的空间并不一样,如果希望在sum函数中使用全局变量g_sum_data,可以采用global来进行修饰:
#!/usr/bin/python
# -*- coding: UTF-8 -*-
g_sum_data = 0 # 这是一个全局变量
# 可写函数说明
def sum( arg1, arg2 ):
#返回2个参数的和."
global g_sum_data #这里添加global,表示使用的是全局变量
g_sum_data = arg1 + arg2
print ("local : ", g_sum_data)
if __name__ == "__main__":
#调用sum函数
sum( 10, 20 )
print ("global : ", g_sum_data)
输出如下:
如果要修改嵌套作用域(enclosing 作用域,外层非全局作用域)中的变量则需要 nonlocal 关键字了,如下实例:
def outer():
data= 10
def inner():
nonlocal data# nonlocal关键字声明
data= 100
print(data)
inner()
print(data)
outer()