【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的規則查詢變數,即:在區域性找不到,便會去區域性外的區域性找,再找不到就會去全域性找,最後去內建中找。如果這樣還找不到,那就提示變數不存在的錯誤。