作用域:程序创建、访问、改变一个变量时,都是在一个保存该变量的空间内进行,这个空间为命名空间,即作用域。
python作用域是静态的,变量被赋值、创建的位置决定了其被访问的范围,即变量作用域由其所在位置决定。
a = 1 #a为全局变量
def local(): #local也在全局作用域中
b = 2 #b为局部变量
在Python中,使用一个变量时并不严格要求需要预先声明它,但是在真正使用它之前,它必须被绑定到某个内存对象(被定义、赋值);这种变量名的绑定将在当前作用域中引入新的变量,同时屏蔽外层作用域中的同名变量。
a = 1
def local():
a = 2 #由于python不需要预先声明,因此在局部作用域中引入新的变量,而没有修改全局变量
local()
print(a)
输出1
a = [1]
def local():
a = [1,2]
local()
print(a)
输出[1]
想要实现局部修改全局变量,有两种办法: #(1)增加global,nonlocal关键字
a = [1]
def local():
a = [1,2]
local()
print(a)
输出[1, 2]
#(2)对于可变对象,如list,dict等,使用内置函数
b = [1]
def local():
b.append(2)
local()
print(b)
输出[1, 2]
def local(i):
a = [] #此处a在add函数的嵌套作用域内
def add():
a.append(i)
return a
return add
temp = local(1)
print(temp())
输出[1]
使用规则: 从上往下顺序创建,从下往上搜索,即搜索遵循LEGB原则,如果一直搜索不到则报错。
注意:Python与C有着很大的区别,在Python中并不是所有的语句块中都会产生作用域。只有当变量在Module(模块)、Class(类)、def(函数)中定义的时候,才会有作用域的概念。如下边语句在python中是不报错的,而在C++等中则报错。
>>>for i in range(3):
... a = i
>>>print(a)
2
一个易错的例子:
name = "lbj"
def f1():
print(name)
def f2():
name = "coldplay"
f1()
f2()
输出lbj
#在调用f1时,name在局部没有,会去搜索全局而f2的name只是局部的,与全局无关,因此输出lbj