【Python面試題_2023.3.10】
下面的代碼執行後輸出什麼?
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的規則查找變量,即:在局部找不到,便會去局部外的局部找,再找不到就會去全局找,最後去內建中找。如果這樣還找不到,那就提示變量不存在的錯誤。
「其他文章」