【Python面試題_2023.3.10】

語言: CN / TW / HK

原文鏈接:http://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的規則查找變量,即:在局部找不到,便會去局部外的局部找,再找不到就會去全局找,最後去內建中找。如果這樣還找不到,那就提示變量不存在的錯誤。