更多課程 選擇中心

Python培訓
美國上市教育機構

400-111-8989

Python培訓

Python變量名與作用域的坑

  • 發布:Python培訓
  • 來源:練習題庫
  • 時間:2017-09-19 17:36

不管你是正準備學習Python的小白,還是剛入門的菜鳥,亦或是經驗豐富的大牛,你們學習一門語言的第一步都是一樣的,那就是——基礎知識。但是很多人可能在學習的過程中忽略了基礎知識的重要性。今天,我們就來為大家分享一個由于基礎知識不扎實而誤入的坑。

一位有多年Python使用經驗者的分享

使用python有些年頭了,自認為對Python的基本知識很了解了,某天發生的一件事讓我對Python有了更多的認識。

某一天小伙伴讓我幫忙看以下一段代碼,具體內容和函數名字可以不用太過在意,命名上做了一些特殊處理,但是不影響代碼邏輯和要表達的意思。

for循環中當node_type為fb時,將FBX對象返回并作為全局變量dut(node_name的內容是字符串dut),接下來print dut,報錯。

錯誤信息如下:


小伙伴提到,如果將with cli_ctx as dut這個block刪除掉,代碼執行正常。聽到這里,我的第一反應是變量作用域的問題,但是也無法道出其中原委,于是建議我的小伙伴,將context manager那一段代碼改成with cli_ctx as d,重新嘗試一下是否有問題,同時我在網上繼續搜索相關的原因,之后由結果和理論結合分析問題的原因。

幸運的是,代碼修改以后,執行正常,我也找到了一些文章來解釋這個問題,我的第一感覺也沒有錯,的確是變量作用域的問題,代碼在執行過程中,print dut實際上是在訪問Local variable,而不是我們期望的global variable dut。

參考 Python 的官方文檔和搜索到的資料,總結出具體原因如下:

當搜索一個變量的時候,先從局部作用域開始搜索,如果在局部作用域沒有找到那個變量,就會在全局變量中找這個變量,如果找不到拋出異常Unbound-LocalError。

如果內部函數有引用外部函數的同名變量或者全局變量,并且對這個變量有修改,那么 python 會認為它是一個局部變量。因為對變量的定義在代碼塊以外,當前代碼塊中沒有變量的定義和賦值,所以報錯。

在我們的代碼中,全局變量 dut 雖然創建了,但是由于在函數代碼塊中,下文中有 context manager cli_ctx對變量dut進行了賦值操作,導致在函數block中,dut成為了局部變量,而非全局變量。

對變量賦值的操作“=”是很明顯的語句,其他不是那么明顯的賦值操作有:for循環中的賦值,except語句中的賦值,with...as...{var}中的var。

總結:避免誤入一些不必要的坑,基礎知識一定要學扎實!


預約申請免費試聽課

填寫下面表單即可預約申請免費試聽!怕錢不夠?可就業掙錢后再付學費! 怕學不會?助教全程陪讀,隨時解惑!擔心就業?一地學習,可全國推薦就業!

上一篇:Python基礎篇:一個小時搭建一個全棧 Web 應用框架
下一篇:搭建python數據分析平臺教程

python中文亂碼的解決方法

Python編程練習四

Python編程練習三

選擇城市和中心
黑龍江省

吉林省

河北省

湖南省

貴州省

云南省

廣西省

海南省

4438全国大成网人网站