你真的理解Python中的賦值 傳參嗎?

2021-09-22 18:45:18 字數 2077 閱讀 7526

在學習程式設計的過程我們都會遇到很多定義,之前在遇到這些定義的時候,我有一種強迫症。就是不搞清楚每乙個字的含義,不善罷甘休。但是每次都會盡興而來,失望而歸。多次之後我學乖了,就是不糾結實際每乙個字的含義,用自己能懂的方式理解他們,比如今天要說的引用傳遞和值傳遞

官方的定義是這樣的

值傳遞:

引用傳遞:

這種每乙個字我都認識,但連起來我就不知道啥意思的感覺,已經伴隨了我這個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,總剩餘空...