变量的作用域
变量的作用域,就是python变量的有效范围,也就是变量在那个范围可以被访问,有些变量可以在任意位置被访问,有些变量只能在某一个代码块中被访问。
变量的作用域取决于变量被定义的位置,变量的作用域大致可以被概括为:全局变量和局部变量。
全局变量
顾名思义,全局变量就是在整个程序的任意地方都能被访问的变量
定义全局变量的方法
-
在所有的函数体外面定义
name = "python" def show(): print("函数体内部访问", name) show() print("函数体外访问", name) ----------------------------------- 函数体内部访问 python 函数体外访问 python
-
通过关键字
global
定义def show(): global name name = "python" print("函数体内部访问", name) show() print("函数体外访问", name) ----------------------------------- 函数体内部访问 python 函数体外访问 python
注:在使用
global
修饰后变量是不可以直接赋值的,直接赋值会报错, 同时使用global
会由一个问题就是,函数体外部已经定义了同名的变量,那么我们来看看会出现什么情况# 无 global num = 0 print("全局变量num的值: ",num) def show(): num = 5 print("函数体show()中num的值: ", num) def inner(): num = 10 print("函数体inner()中num的值: ", num) inner() print("执行函数inner()后num的值: ", num) show() print("执行函数show()后num的值: ",num) print("================================") num = 0 print("全局变量num的值: ",num) def show(): num = 5 print("函数体show()中num的值: ", num) def inner(): global num num = 10 print("函数体inner()中num的值: ", num) inner() print("执行函数inner()后num的值: ", num) show() print("执行函数show()后num的值: ",num) ----------------------------------- 全局变量num的值: 0 函数体show()中num的值: 5 函数体inner()中num的值: 10 执行函数inner()后num的值: 5 执行函数show()后num的值: 0 ================================ 全局变量num的值: 0 函数体show()中num的值: 5 函数体inner()中num的值: 10 执行函数inner()后num的值: 5 执行函数show()后num的值: 10
通过上面的例子不难看出,在函数体内部使用
global
修饰一个和全局变量同名的变量时,会直接操作全局变量,那么我们如何规避这种情况呢?使用关键字nonloacl
来修饰num = 0 print("全局变量num的值: ",num) def show(): num = 5 print("函数体show()中num的值: ", num) def inner(): nonlocal num num = 10 print("函数体inner()中num的值: ", num) inner() print("执行函数inner()后num的值: ", num) show() print("执行函数show()后num的值: ",num) ----------------------------------- 全局变量num的值: 0 函数体show()中num的值: 5 函数体inner()中num的值: 10 执行函数inner()后num的值: 10 执行函数show()后num的值: 0
使用
nonlocal
修饰变量后,变量不会直接修改全局变量的而是修改函数体父级函数内部的同名变量注:
nonlocal
只能在嵌套内使用,否则不能使用>>> num = 0 >>> def inner(): ... nonlocal num ... num = 10 ... print("函数体inner()中num的值: ", num) ... File "<stdin>", line 2 SyntaxError: no binding for nonlocal 'num' found # 编译不通过 >>> def show(): ... num = 5 ... def inner(): ... nonlocal num ... num = 10 ... >>>
局部变量
局部变量顾名思义就是,只能在局部被访问的变量,python文件的局部就是,一个个代码块(函数体,类…)
def show():
name = 'python'
print("函数体内部访问", name)
show()
print("函数体外访问", name)
-----------------------------------
函数体内部访问 python
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'name' is not defined
函数体内部定义的变量,在函数体外部被使用会提示NameError: name 'name' is not defined
获取变量作用域内的变量
在一些情况向我们需要获取某个作用域里面所有的变量,python提供了3种方法
-
global():python内置函数,用来返回全局范围内所有变量,以字典的形式返回,键是变量名,值是变量的值
name = 'python' def show(): age = 18 print(globals()) ----------------------------------- {...(内置变量), 'name': 'python', 'show': <function show at 0x000001E0FB6AB550>}
我们可以通过
globals()
返回的字典,获取变量值、修改全局变量print('name:',globals()['name']) globals()['name'] = '龟叔' print('name:',globals()['name']) ----------------------------------- name: python name: 龟叔
-
locals():python内置函数,以字典的形式返回其被调用时的作用域内的所有变量,如果在全局调用和
global()
作用一样name = 'python' def show(): age = 18 print(locals()) show() print(locals()) ----------------------------------- {'age': 18} {...(内置变量), 'name': 'python', 'show': <function show at 0x000001D2E055B550>}
locals()
可以获取所有的局部变量,也可以像global()
获取变量的值,但是不能修改变量的值def show(): age = 18 print(locals()) print('age:', locals()['age']) locals()['age'] = 30 print('age:', locals()['age']) show() ----------------------------------- {'age': 18} age: 18 age: 18
但是全局范围可以修改
name = 'python' def show(): age = 18 print(locals()) show() print(locals()) print('name:',locals()['name']) locals()['name'] = '龟叔' print('name:',locals()['name']) ----------------------------------- {...(内置变量), 'name': 'python', 'show': <function show at 0x00000247F915B550>} name: python name: 龟叔
-
vars(Object):以字典的形式返回一个对象里面的所有变量,如果没有参数,就和
locals()
的功能一样class Book: name = 'python' def show(): age = 18 print(vars()) Book.show() print(vars(Book)) ----------------------------------- {'age': 18} {...(内置变量), 'name': 'python', 'show': <function Book.show at 0x000001B049432E50>,...(内置变量)}