【老闆叫我了】輕鬆理解python變量的做用域 和 閉包

前言

技術不須要枯燥的術語也能夠被理解java

別人的每次提問都能提醒本身學習的東西是什麼python

因此我寫了這個系列web

但願你們能在輕鬆愉快的提問中理解枯燥的技術點面試

正文

某天,小方正在工位上哼哧哼哧寫代碼,忽然微信里老板又叫他微信

小方啊,你過來一下網絡

我內心一緊,是我上個月請假次數太多了被注意了嗎?仍是我偷偷摸魚被舉報了?懷着忐忑不安的心,我來到了老闆的辦公室閉包

哎,小方你來啦!上次不是問你 選python仍是選java嘛 ,我想了想就作個數據分析,仍是簡單點用python吧。看了一遍python的基礎語法,怎麼發現這跟我當年學的徹底不同啊!函數內部怎麼能訪問外部的成員變量呢?你快給我講講編輯器

(原來是問這個啊)噢,老闆,這個說的是python變量的做用域....函數

啥的做用域?post

變量!變量的做用域!! 咱們每一個人都在接觸變量這個概念。但變量是什麼東西呢? 說白了他就是計算機裏的一塊內存空間,就是存放數值的地方。咱們修改變量的值實際上修改的是內存空間存儲的值。當咱們寫a = 1 這行代碼時,其實是幹了兩件事:

一是新建了一塊內存空間存放a

二是把1這個值塞到這個內存空間裏

咱們能夠在代碼的許多地方定義變量,其實就是新建了許多個存放數值的內存空間

噢噢,這些我上大學的時候學過,那你剛說的python的做用域是怎麼回事?

「做用域」簡單理解就是變量起做用的區域。咱們定義一個變量後確定不是處處都能使用的,這就須要咱們明白變量的做用範圍,也就是做用域。其實很簡單,就是一個洋蔥結構,一環套一環。

變量的做用域遵循一個原則,裏面的能夠訪問外面的,外面的不能訪問裏面的。老闆你徹底不須要記這些名詞啦,規則啦,一個例子你就懂了:

看,很簡單吧

噢,原來我直接定義的變量就是全局變量啊,不就是至關於java里加了static修飾的變量嘛,怪不得能直接訪問,早說嘛

對對對,老闆你最聰明瞭!你是最棒的!

那個嵌套做用域是咋回事啊?我咋歷來沒見過?

這是python特有的寫法。 python能夠在函數內部再定義函數,也就實現了函數嵌套。嵌套函數裏面的變量就是嵌套的局部變量,外部函數就是局部變量,他們同樣遵循變量訪問的原則噠

胡說!我剛剛試了一下,嵌套函數不能修改外部函數的變量!你是否是不行啊?!回頭就扣你工資!

別別別! 老闆!我剛說的是「訪問」,訪問啊!你用嵌套函數修改外部函數變量,這是閉包啊,閉包固然沒法直接修改局部變量了,他只有訪問權,沒有修改權!我如今給你寫個例子,你別扣我工資啊啊!!

那你剛剛一本正經的說什麼裏面訪問外面的,我懷疑你小子在晃點我!

要修改也能夠... 使用nonlocal關鍵字聲明一下就能夠改了

真是的,話都不說清楚。對了,你剛剛說的閉包是啥玩意?

(嗚嗚嗚)咱們定義的函數,其實是一個處理一段邏輯的代碼塊,咱們能夠叫它「一塊代碼」,也能夠形象地說這是一個「包」。「閉包」呢,就是這個「包」它不知足只處理本身包含的這些邏輯,還想引用函數以外的一些變量,當它知足這些條件時,就把這個『函數+變量』總體稱爲閉包

關於閉包有一道經典面試題,老闆你能夠看下:

下面代碼輸出的結果是什麼?

這麼簡單,不就是 [0,2,4] 嗎?你當我傻麼

是 [4,4,4] 我給你跑一下...

剛纔我不是說過變量的本質麼。看上去這個for循環的索引值i每次都做爲嵌套函數的一部分添加到list裏了。但您仔細想一想,return x * i 是何時被調用的?是 print f(2)的時候才調用的對吧,這時候的x * ii的值是多少呢?i 只是一塊被定義出來的內存空間,隨着for循環一次次改變本身存儲的值,當for循環結束時,它的值就不會再變了,因此i的值在被調用的時候一直是 2,結果也就是 [4 ,4,4] 了。

那我就想要 [0,2,4] 咋辦?

額,也有辦法。我第一次作這道題的時候也覺得是 [0,2,4] ,後面知道正確答案後才發現本身思惟過程當中有一個盲點。就是我默認每次for 循環的i都存到func裏了。若是要想要 [0,2,4] ,就是想辦法把i的值存一下給嵌套函數func。而函數的參數原本不就是複製值到函數內部麼。因而我就在func外面再定義一個函數,參數值是i,目的就是把i保存下來提供給嵌套函數使用。這樣嵌套函數和i就組成了一個閉包,結果也符合預期

嗨,我剛沒看清。這玩意有啥用啊,花裏胡哨的,這幫面試官就會整人!

也不是徹底沒用.... 閉包的變量能夠用來保存上一次的運行環境。當咱們有需求是須要上一次的運行結果做爲這一次的參數時,就能夠用閉包來解決。好比你寫一個「下棋遊戲中棋子移動」的代碼,棋子的每次移動都是用上一次的座標爲起點的。這時候就能夠用閉包來解決了。這裏也有一道面試題,老闆你要不要看看?

我看面試題有啥用?! 等會,那啥,待會發我微信就行了

(老闆你果真想...)好的。。

好了好了,這些我都會了,也沒什麼難的嘛,你先回去吧,好好工做啊,公司還得靠你!

(尷尬)哈哈,那我先走了

(關門)

過了一會,我把題目發給了老闆:

答案是:

輸出結果:

隨手一讚,好運爆棚!

以上就是本期的所有內容啦,若是你喜歡這篇文章的內容,或者哪怕有一點小小的幫助,能夠點個贊再走哦 ~

求贊,求關注,求三連 ! 我翻個跟斗謝謝大夥的捧場了!

我叫方木,大家也能夠叫我小方 ~

天天我都會分享一篇文章給你們

多是「網絡」,多是「計算機基礎」,也多是「python」,「數據分析」

我一直以爲,技術不須要枯燥的術語也能夠被理解

因此我想把我理解的東西整理分享給你們

若是你有什麼建議或者意見的話 歡迎 提給我

大家的每一個 點贊關注 都是我持續輸出的動力!

咱們都在這個世界中掙扎着

歡迎你們和我一塊兒成長

相關文章
相關標籤/搜索