【Python面试题_2023.3.10】
原文链接:https://mp.weixin.qq.com/
下面的代码执行后输出什么?
val = 3
def print_variable():
val += 1
print(val)
print_variable()
A:4 ,B:2 ,C:1,D:error
陷阱分析
选A,这个太简单了,很多人想,函数内部没有定义val,那么就去外部找,找到val=3,紧接着执行加一操作,所以最后输出4。
答案解析
其实按照Python的规则,如果在函数内部要修改一个变量,那么这个变量需要是内部变量,除非你用global声明了它是外部变量。这个面试题中没有在函数内部定义变量val,所以会弹出局部变量在未定义之前就引用的错误,输出如下的错误信息。
所以正确应该选D
考点补充
Python 的作用域一共有4种,分别是:
- L(Local):最内层,包含局部变量,比如一个函数/方法内部。
- E(Enclosing):包含了非局部(non-local)也非全局(non-global)的变量。比如两个嵌套函数,一个函数(或类) A 里面又包含了一个函数 B ,那么对于 B 中的名称来说 A 中的作用域就为 nonlocal。
- G(Global):当前脚本的最外层,比如当前模块的全局变量。
- B(Built-in):包含了内建的变量/关键字等,最后被搜索。
Python以L –> E –> G –>B的规则查找变量,即:在局部找不到,便会去局部外的局部找,再找不到就会去全局找,最后去内建中找。如果这样还找不到,那就提示变量不存在的错误。
「其他文章」