您的位置:首页 > 编程语言 > Python开发

Python--全局变量、局部变量、作用域

2019-04-02 16:47 204 查看

全局变量、局部变量、作用域

作用域

      作用域简单说就是一个变量的命名空间。代码中变量被赋值的位置,就决定了哪些范围的对象可以访问这个变量,这个范围就是命名空间。python赋值时生成了变量名,当然作用域也包括在内。
      一个全局变量的命名空间是这个模板,一个局部变量的命名空间是一个局部。

LEGB规则

locals->enclosing function -> globals -> builtins

locals:表示在在当前本地的命名空间中进行查找,
enclosing:表示当前函数的外部函数的本地命名空间
globals:表示全局变量
builtions:表示系统自动加载的变量

查找变量,首先在locals中进行查找,然后enclosing,再然后globals,接着最后在builtins中进行查找,如果在某一级中先找到,则停止向下查找,如果都没找到,则报错。(提示:函数名也是变量)

全局变量

      定义在模板的最外层或者if name == "main"的变量,被称之为全局变量。
全局变量不仅可以在函数体外部被访问到,而且函数体内部也可以查找的到。

#!encoding=utf-8
a = [1, 2]
def test():

a.append(456)
print(a)
test1()

def test1():
print("test1")

if __name__ == '__main__':

print(a)
test()
print(a)

输出为:

[1, 2]
[1, 2, 456]
test1
[1, 2, 456]

使用global关键字修饰的变量,表示在LEGB规则的global等级开始查找该变量,如果没找到,则报错,也就是说,使用global修饰的变量,必须在再全局中及其以下的等级中定义定义。global关键字可以用在任何地方,包括最上层函数中和嵌套函数中,即使之前未定义该变量,global修饰后也可以直接使用。

#!encoding=utf-8
a = [1, 2]
def test():
global print   #builtin 等级的变量
global a       #global 等级的变量
a.append(456)
print(a)
test1()

def test1():
print("test1")

if __name__ == '__main__':

print(a)
test()
print(a)

输出结果为:

[1, 2]
[1, 2, 456]
test1
[1, 2, 456]

使用globals([Namespace])函数,可以查看所有指定命名空间内的全部全局变量。不指定参数,则默认为当前的模板。

局部变量

      没有定义为全局变量的变量与没有使用global声明的变量统称为局部变量。局部变量的作用域是函数体的内部,在外部不可用。
如:

#!encoding=utf-8
a = [1, 2]
def test():
b= [1,2]
b.append(456)
print(a)
test1()
print(globals())
print(locals())

if __name__ == '__main__':

print(b)
test()

输出结果为:

使用locals([Namespace])函数,可以查看所有指定命名空间内的全部局部变量。不指定参数,则默认为当前的命名空间。

#!encoding=utf-8
a = [1, 2]
def test():
b= [1,2]
b.append(456)
print(locals())

if __name__ == '__main__':

test()

输出结果为:

{'b': [1, 2, 456]}

nonlocal 可以用来修饰变量,nonlocal关键字修饰变量后标识该变量是上一级函数中的局部变量,如果上一级函数中不存在该局部变量,nonlocal位置会发生错误(最上层的函数使用nonlocal修饰变量必定会报错)。nonlocal关键字只能用于嵌套函数中,而且只有python3中有,并且外层函数中定义了相应的局部变量,否则会发生错误(见第一)。

#!encoding=utf-8
a = 3
def test():
b = 100
def test1():
nonlocal b   #省去这一行则报错
b = b + 1
print(b)
return test1

if __name__ == '__main__':

ret = test()
ret()

输出结果为:

101

重点来了:
      使用非当前作用域的变量的而且未使用global或者nonlocal时候,当变量是不可变类型的时候,使用的时候不可以修改引用的变量的值。(如:整形,字符串),可变类型的数据,(如:列表、字典、集合、类),在引用的时候可以修改引用的变量的值。

#!encoding=utf-8
a = [1,2]
b =3
c= 4
def test():
a.append(3)
print(a)
global b
b=b+1
print(b)
c=c+1

if __name__ == '__main__':

test()

输出结果为:

#!encoding=utf-8

def test():
a = [1, 2]
b = 3
c=4
def test1():
a.append(3)
print(a)
nonlocal b
b = b + 1
print(b)
c = c+1
return test1

if __name__ == '__main__':

ret = test()
ret()

输出结果为:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: