Python学习笔记 - 变量作用域问题

本文主要探讨Python中的变量作用域,包括全局变量和局部变量的区别,以及如何使用global关键字将局部变量提升为全局变量。同时,介绍了globals()和locals()函数用于查看全局和局部变量,以及eval()和exec()函数在执行代码字符串时的角色。
摘要由CSDN通过智能技术生成

本内容均来自在北京图灵学院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
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值