本内容均来自在北京图灵学院Python免费全栈学习的课堂笔记
变量作用域
- 变量由作用范围限制
- 分类:按照作用域分类
- 全局(global):在函数外部定义
- 局部(local):在函数内部定义
- 变量的作用范围:
- 全局变量:在整个全局范围都有效
- 全局变量在局部可以使用(即函数内部可以使用函数外部定义的变量)
- 局部变量在局部范围内可以使用
- 局部变量在全局范围无法使用
- LEGB原则:
- L(local)局部作用域
- E(Enclosing function locale)外部嵌套函数作用域
- G(Global module)函数定义所在模块作用域
- B(Buildin)python内置模块的作用
# a1是全局变量
a1 = 100;
def fun():
# a2是局部变量,作用范围是fun
a2 = 10
print(a1)
print(a2)
return None
print(a1)
fun()
#print(a2)不能访问a2,此时已经离开了a2的作用域
执行结果:
100
100
10
提升局部变量为全局变量
- 使用global关键字
- 案例如下:
#提升局部变量为全局变量案例
def fun():
global a2
a2 = 100
print(a2)
return None
# 要先调用fun()函数,然后再使用变量a2,否则依然会报a2未定义的错误
fun()
print(a2)
执行结果:
100
100
globals(),locals()函数
- 可以他通过globals()和locals()函数显示出局部变量和全局变量
- globals(),locals()函数都是内建函数
# globals()和locals()函数
a = 1
b = 2
def fun(c,d):
e = 3
print("Locals={0}".format(locals()))
print("Globals={0}".format(globals()))
return None
fun(4,5)
'''
执行globals()函数的结果之所以很多的原因是
在运行python代码之前,就已经存在很多内建函数
这些内建函数用来支持python代码的运行
'''
执行结果:
Locals={'c': 4, 'd': 5, 'e': 3}
Globals={'__name__': '__main__', '__doc__': 'Automatically created module for IPython interactive environment', '__package__': None, '__loader__': None, '__spec__': None, '__builtin__': <module 'builtins' (built-in)>, '__builtins__': <module 'builtins' (built-in)>, '_ih': ['', '# globals()和locals()函数\na = 1\nb = 2\ndef fun(c,d):\n e = 3\n print("Locals={0}".format(locals()))\n print("Globals={0}".format(globals()))\n return None\nfun(4,5)'], '_oh': {}, '_dh': ['C:\\Users\\覃杨\\Desktop\\Python'], 'In': ['', '# globals()和locals()函数\na = 1\nb = 2\ndef fun(c,d):\n e = 3\n print("Locals={0}".format(locals()))\n print("Globals={0}".format(globals()))\n return None\nfun(4,5)'], 'Out': {}, 'get_ipython': <bound method InteractiveShell.get_ipython of <ipykernel.zmqshell.ZMQInteractiveShell object at 0x000001A87866A4A8>>, 'exit': <IPython.core.autocall.ZMQExitAutocall object at 0x000001A87AE79C88>, 'quit': <IPython.core.autocall.ZMQExitAutocall object at 0x000001A87AE79C88>, '_': '', '__': '', '___': '', '_i': '', '_ii': '', '_iii': '', '_i1': '# globals()和locals()函数\na = 1\nb = 2\ndef fun(c,d):\n e = 3\n print("Locals={0}".format(locals()))\n print("Globals={0}".format(globals()))\n return None\nfun(4,5)', 'a': 1, 'b': 2, 'fun': <function fun at 0x000001A87AF68D08>}
eval()函数
- 把字符串当成代码来执行,返回表达式执行后的结果
- 语法:
eval(string_code,globals=None,locals=None)
exec()函数
- 跟eval()函数相似,但它没有返回值
# eval(),exec()函数案例
x = 100
y = 200
# 执行x+y
z1 = eval("x+y")
z2 = exec("x-y")
eval("print(x*y)")
exec("print(x-y)")
print(z1)
print(z2)
执行结果:
20000
-100
300
None