通过5个知识点轻松搞定Python的作用域
1、块级作用域 想想此时运行下面的程序会有输出吗?执行会成功吗? #块级作用域 if 1 == 1: name = "lzl" print(name) for i in range(10): age = i print(age) 我们先看下执行结果 C:/Users/L/PycharmProjects/s14/preview/Day8/作用域/main.py lzl 9 Process finished with exit code 0 代码执行成功,没有问题;在Java/C#中,执行上面的代码会提示name,age没有定义,而在Python中可以执行成功,这是因为在Python中是没有块级作用域的,代码块里的变量,外部可以调用,所以可运行成功; 2、局部作用域 回顾之前学过的知识,我们学函数的时候,函数是个单独的作用域,Python中没有块级作用域,但是有局部作用域;看看下面的代码 #局部作用域 def func(): name = "lzl" print(name) 运行这段代码,想想会不会有输出? Traceback (most recent call last): File "C:/Users/L/PycharmProjects/s14/preview/Day8/作用域/main.py",line 23,in <module> print(name) NameError: name 'name' is not defined 运行报错,我相信这个大家都能理解,name变量只在 #局部作用域 def func(): name = "lzl" func() #执行函数 print(name) 对之前的代码添加了一句代码,在变量name打印之前,执行了一下函数,此时打印会不会有变化? Traceback (most recent call last): File "C:/Users/L/PycharmProjects/s14/preview/Day8/作用域/main.py",in <module> print(name) NameError: name 'name' is not defined 执行依然报错,还是回到刚才那句话:即使执行了一下函数,name的作用域也只是在函数内部,外部依然无法进行调用;把前两个知识点记住,接下来要开始放大招了 3、作用域链 对函数做下调整,看看下面的代码执行结果如何? #作用域链 name = "lzl" def f1(): name = "Eric" def f2(): name = "Snor" print(name) f2() f1() 学过函数,肯定知道最后 4、终极版作用域 好,铺垫了够了,终极版的来了~~ #终极版作用域 name = "lzl" def f1(): print(name) def f2(): name = "eric" f1() f2() 想想最后f2()执行结果是打印“lzl”呢,还是打印“eric”?记住自己的答案,现在先不把答案贴出来,先看看下面这段代码: #终极版作用域 name = "lzl" def f1(): print(name) def f2(): name = "eric" return f1 ret = f2() ret() #输出:lzl 执行结果为“lzl”,分析下上面的代码, #终极版作用域 name = "lzl" def f1(): print(name) def f2(): name = "eric" f1() f2() # 输出:lzl 是的,输出的是“lzl”,记住在函数未执行之前,作用域已经形成了,作用域链也生成了 5、新浪面试题 li = [lambda :x for x in range(10)] 判断下li的类型?li里面的元素为什么类型? print(type(li)) print(type(li[0])) # <class 'list'> # <class 'function'> 可以看到li为列表类型,list里面的元素为函数,那么打印list里面第一个元素的返回值,此时返回值为多少? #lambada 面试题 li = [lambda :x for x in range(10)] res = li[0]() print(res) #输出:9 li第一个函数的返回值为9还不是0,记住:函数在没有执行前,内部代码不执行;博客里面的代码可以自己练练,加深下印象 总结 以上就是这篇文章的全部内容了,不知道对大家的学习和工作能不能带来一些帮助,如果大家有疑问可以留言交流。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |