深入理解Python變數與賦值

2021-09-26 12:06:19 字數 1777 閱讀 9741

python是一門很特殊的語言,它和c語言不一樣,python是"弱型別"的指令碼語言,變數在宣告的時候並不定義它的型別,而是通過賦值的型別體現出來,所以一般python變數在宣告時需要賦初值.

在c語言中, 給變數賦值時,需要先指定資料型別,同時會開闢一塊記憶體區域,用於儲存值,

例如:

int a =0;

當給a賦值: a=5;

這時候記憶體位址沒有變,只是該段記憶體中的值變了,變成了2。

這時候如果: int b=a;

相當於把值拷貝了乙份傳遞給變數b,b是新開闢的一段記憶體區域,此時a和b的位址並不相同

而在python中,「變數」的嚴格叫法是「名字(name)」,也可以理解為標籤,就像每個人的姓名一樣,只是標記我們的乙個標籤。這種方式是和python「萬物皆物件」的思想相契合的。

比如:上面這段報錯,說的很清楚是name 「a」 而不是variable 「a" 沒有被定義。

再如,上面這段**,即使是「10」也是被看作是乙個int類的物件,a指向這個物件。

在python中,當執行: a = 1

python首先會在分配一段記憶體空間用來建立int型物件「1」,然後用a指向它;

再執行: a = 2

python 同樣會劃分記憶體空間來建立int型物件「2」,然後用 a執行它,這時候,物件「1」就沒有辦法通過a來找到,不久後將會被記憶體**。

再執行:b = a

這裡和c語言是完全不一樣的,定義b的時候不需要分配記憶體空間,這樣我們既可以通過a來訪問2也可以通過b來訪問2,此時a和b的位址和值都是一樣的。

理解了python中的變數與賦值後,再來看函式的引數傳遞,如下所示

這裡把形參g傳遞到函式中,相當於執行 a = g ,這時a和g指向同乙個物件,在函式內部給a重新賦值,其實是讓a重新指向乙個新的物件,並不會對g的值造成影響,同樣的函式在c語言中也不會改變函式外面的值,這是因為,形參只是把實參的值接收過來了,二者並不分配在同一位址。

再看看下面這種情況

為什麼這次就可以用函式改變外部變數呢?這是因為函式裡是對變數指向的物件進行修改,其實,在python內部是類呼叫自己的方法進行的修改這時並沒有建立新的物件,這時候就能修改外部變數了,就像乙個人換了一身衣服,可是它的還是這個人,它的名字仍然表示它。

所以,在python中,函式能不能修改外部變數,主要看這個變數的型別是可修改的還是不可修改的,在python中strings, tuples, 和 numbers 是不可更改的物件,不能修改。

深入理解PHP原理之變數賦值

在前面的文章 深入理解php原理之變數結構 中我已經介紹了php變數的內部結構,下面我將會對變數賦值過程中,php內部對資料處理的原理進行闡述,不過在講述該原理前,需要先了解一下變數名和它的值是如何關聯起來的,這個對變數賦值內部原理的理解非常重要,例如 a 1 這個例子看起來非常簡單,但是你知道 變...

深入理解PHP中賦值與引用

先看下面的問題 a 10 將常量值賦給變數,會為a分配記憶體空間 b a 變數賦值給變數,是不是copy了乙份副本,b也分配了記憶體空間呢?c a 引用是不會為c分配空間的,c和a是共用乙份空間的。對於中間的那個問題,你的答案是什麼呢?在今天之前,我的答案是會為b分配記憶體空間。因為我是這麼理解的 ...

深入理解PHP物件賦值

1 2 深入理解php物件賦值 3echo 45 obj new stdclass 6 obj name pig 7var dump obj object stdclass 1 1 89 copy obj obj copy都是new stdclass返回的同乙個識別符號的拷貝 10var dump ...