在學習程式設計的過程我們都會遇到很多定義,之前在遇到這些定義的時候,我有一種強迫症。就是不搞清楚每乙個字的含義,不善罷甘休。但是每次都會盡興而來,失望而歸。多次之後我學乖了,就是不糾結實際每乙個字的含義,用自己能懂的方式理解他們,比如今天要說的引用傳遞和值傳遞
官方的定義是這樣的
值傳遞:
引用傳遞:
這種每乙個字我都認識,但連起來我就不知道啥意思的感覺,已經伴隨了我這個9年+4年教育生涯,至此對它深惡痛絕。
賦值回到正題,我們暫時拋開兩個概念,我們先來說下 python 中的賦值,以我的理解,其實就是下定義的步驟,如果大家看過《武林外傳》中第二十九集《呂聖人智鬥姬無命 佟掌櫃火拼展紅綾》,就更容易理解以下的概念了
賦值這個操作,其實可以理解成給物體貼標籤,或者可以理解為給物體命名,既然是名稱,就像《武林外傳》中的一樣,你可以叫「姬無命」,我也可以叫「姬無命」。重要的是這個物體,而不是標籤。其中,這個標籤(或者名稱),我們在計算機中把它叫做變數,物體就是實際的值
我們知道,在計算機中,值會占用一定的空間去儲存,而計算機為了方便找到它,則會給它乙個位址,方便我們找到它
我們寫段**理解下
看圖理解很簡單,這裡的物體是字元「張小雞」,我們把它貼上標籤「zxj」,第二個地方賦值就相當於再貼乙個標籤「jwm」。就是上面說的,你可以叫「張小雞」,我也可以叫「張小雞」,看後面,他們實際上的記憶體位址都是一樣的
引數傳遞
在理解了上面的過程,我們再來看看 python 中呼叫函式傳遞引數的過程。先說結論,python 中引數的傳遞就是賦值的過程。我們來看下這段**
這一段的輸出如下
我們在賦值時,其實就相當於把函式的形參b這個標籤又貼在了「張小雞」物體上。後面我們再執行b=「姬無命」時,就相當於把b這個標籤從「張小雞」這個物體上撕下來,放到「姬無命」這個物體上
可變和不可變物件
python 內部對物件進行了區分,即為可變物件和不可變物件,型別如下
int、str、float、tuple等為不可變物件
list、dict、set等為可變物件
不可變物件我們上面已經說過他的賦值的特點,我們這裡主要看可變物件。對於可變物件,我們可以簡單的理解為做了個包裝盒。我們在賦值的時候,這個標籤是貼在了這個包裝盒子上。計算機會記錄這個盒子的位址,裡面每乙個物體的位址,計算機也仍然會記錄
輸出如下
我們將盒子裡面的「張小雞」替換為「姬無命」,又再盒子裡面新增了「tom」,自始至終,因為我們沒有動過盒子本身,所以他的位址不會發生變化
結合上圖來看下,我們修改一下**,再深入看下盒子和盒子裡面物體的位址的變化
輸出如下
看,我們的盒子(即id(a))自始至終都沒有變化,而內部因為更換過物體,所以裡面的位址都不一樣了
拓展思考
上面這段**的輸出結果是
你真的理解程式中的變數嗎
關於變數,很多人肯定覺得這有啥可說的,不就是int a 10這類的嗎,這樣的太簡單了,學習程式語言入門的時候就已經知道了,能沒啥可講的。可是,你真的理解變數嗎,你知道變數的本質是什麼嗎?變數的概念 既能讀又能寫的記憶體物件,稱為變數 若一旦初始化後不能修改的物件則稱為常量。上述概念中說到了記憶體物件...
你真的理解補碼嗎?
計算機數值運算的基礎硬體就是加法器,所以我們就從加法器講起。加法器是計算機數值計算的最基礎硬體單元,加減乘除都是以加法器為基礎實現的。加法器的構成如下圖所示,其中s是和數,c是進製。半加器電路是指對兩個輸入資料位相加,輸出乙個結果位和進製,沒有進製輸入的加法器電路。是實現兩個一位二進位制數的加法運算...
margin auto你真的理解麼?
含義 margin auto是具有強烈計算意味的關鍵字,用來計算元素對應方向應該獲得的剩餘空間大小 填充規則 1 如果一側定值,一側auto,則auto為剩餘空間大小 2 如果兩側均是auto,則平分剩餘空間 左邊距是20px,右邊距是80px。這裡son寬度是200px,容器是300px,總剩餘空...