python 變量賦值,引用,初始化問題


可變數據類型,與不可變數據類型

是指向同一個內存地址的,python的賦值是只是把變量的內存地址賦值給另一個變量,這一點可以使用python的內建方法id()來進行測試,對於你給的例子:
我們假設'QH'這個字符串在內存中的地址是a,'LJQ'在內存中的地址是b
you='QH' #讓you變量指向a地址
me=you #讓me變量和you變量一樣指向a地址
you='LJQ' #修改you變量,讓它指向到b地址
print you #可想而知you指向的是b地址,所以它的值為'LJQ'
print me #me指向的是a地址,所以它的值為'QH' 輸出: LJQ QH
可以使用ID來加強對python的賦值機制的理解
>>> a = 'asdf'
>>> id(a) 872552384
>>> b = a
>>> id(b) 872552384
>>> c = 'asdf'
>>> id(c) 872552384
>>> a = 'haha'
>>> id(a) 872552672
>>> id(b) 872552384
>>> a 'haha'
>>> b 'asdf'
指向同一個內存地址. 但是即使是這樣說,實際上還是有兩種不同的理解
python變量分兩種 mutable immutable, 就是可變和不可變的意思
數字,字符串 tuple (就是“()”這種形式的數組), 這種數據類型是不可變的, 因此 你以上的程序的含義是 you 指向 'QH', me指向you指向的內容,
所以me 就指向了'QH', 然后 you指向'LJQ', 這里是you本身的值變了, 而不是you指向的對象的值變了。

you=[1]
me=you
you.append(2)
print you print me
輸出 [1, 2] [1, 2]
這里, 你看到 you.append(2), 這其實是you指向的 [1]對象進行了append()操作,因此是該對象本身發生了變化([],{}以及其他大部分數據類型都是可變數據類型),
因此 me 和 you都指向同一個對象, 輸出自然就是相同的。

Python中所有變量都是值的引用,也就說變量通過綁定的方式指向其值。 而這里說的不可變指的是值的不可變。 對於不可變類型的變量,如果要更改變量,則會創建一個新值,把變量綁定到新值上,而舊值如果沒有被引用就等待垃圾回收。不可變的類型還有一個特性,就是可以計算其hash值,這樣才能進一步作為字典的key。可變類型數據對對象操作的時候,不需要再在其他地方申請內存,只需要在此對象后面連續申請(+/-)即可,也就是它的address會保持不變,但區域會變長或者變短。

不可變類型包括:int string float tuple

可變類型包括:list dict

http://www.cnblogs.com/vamei/archive/2012/07/10/2582795.html:::

變量和它所指的對象的分離,就是動態類型的核心。由於變量只類似於一個指針,所以它可以隨時指向一個新的對象,即使這個新的對象的類型發生了變化。

動態類型是Python的核心機制之一。可以在應用中慢慢熟悉。

 

 

總結:

變量和對象的分離,對象是內存中儲存數據的實體,變量指向對象。

可變對象,不可變對象

函數值傳遞

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM