python变量作用域解析

概述

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()

 

你可能感兴趣的:(Python,python,变量,作用域)