python變量賦值方法(可變與不可變)
python中不存在所謂的傳值調(diào)用,一切傳遞的都是對象的引用,也可以認為是傳址。
一、可變對象和不可變對象
Python在heap中分配的對象分成兩類:可變對象和不可變對象。所謂可變對象是指,對象的內(nèi)容可變,而不可變對象是指對象內(nèi)容不可變。
不可變(immutable):int、字符串(string)、float、(數(shù)值型number)、元組(tuple)
可變(mutable):字典型(dictionary)、列表型(list)
不可變類型特點:
看下面的例子(例1)
i = 73 i += 2

從上圖可知,不可變對象的特征沒有變,變的只是創(chuàng)建了新對象,改變了變量的對象引用。
看一個例子(例2)
>>>x = 1 >>>y = 1 >>>z = 1 >>> x is y True >>>y is z True
如上所示,因為整數(shù)為不可變,x,y,z在內(nèi)存中均指向一個值為1的內(nèi)存地址,也就是說,x,y,z均指向的是同一個地址,值得注意的是,整形來說,目前僅支持(-1,100)。
總結(jié)一下,不可變對象的優(yōu)缺點。
優(yōu)點是,這樣可以減少重復(fù)的值對內(nèi)存空間的占用。
缺點呢,如例1所示,我要修改這個變量綁定的值,如果內(nèi)存中沒用存在該值的內(nèi)存塊,那么必須重新開辟一塊內(nèi)存,把新地址與變量名綁定。而不是修改變量原來指向的內(nèi)存塊的值,這回給執(zhí)行效率帶來一定的降低。
下面看一個可變對象的例子(例3)
m=[5,9] m+=[6]

二、函數(shù)參數(shù):
Python函數(shù)參數(shù)對于可變對象,函數(shù)內(nèi)對參數(shù)的改變會影響到原始對象;對于不可變對象,函數(shù)內(nèi)對參數(shù)的改變不會影響到原始參數(shù)。原因在于:
1、可變對象,參數(shù)改變的是可變對象,其內(nèi)容可以被修改。
2、不可變對象,改變的是函數(shù)內(nèi)變量的指向?qū)ο蟆?/p>
比如存在2個列表 a 和 b
如果a=b的話, a和b的地址是相同的;如果只是想拷貝,那么就得用 a=b[:]
def mutable(b = []): #函數(shù)使用了缺省變量 b.append(0) return b >>>mutable() [0] >>>mutable() [0,0] >>>mutable() [0,0,0]
這里連續(xù)三次以缺省值,運行函數(shù)3此,每次的結(jié)果都不一樣,按我們的想想,三次的結(jié)果,應(yīng)該是一樣的,都為[0],但是…
那么原因是什么呢,前面說過,一切皆為對象,函數(shù)mutable也為一個對象,使用dir()查看函數(shù)的屬性:
dir(mutable) ['__annotations__', '__call__', '__class__', '__closure__', '__code__', '__defaults__', '__delattr__', '__dict__', '__doc__', '__eq__', '__format__', '__ge__', '__get__', '__getattribute__', '__globals__', '__gt__', '__hash__', '__init__', '__kwdefaults__', '__le__', '__lt__', '__module__', '__name__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__',
上面我們?nèi)芜\行了mutable這個函數(shù),如果用mutable.__defaults__來查看函數(shù)對象的默認參數(shù)變化的話,就會發(fā)現(xiàn)問題了。
>>>mutable.__defaults__ ([],) >>>mutable() [0] >>>mutable.__defaults__ ([0],) >>>mutable() [0,0] >>>mutable.__defaults__ ([0,0],)
仔細觀察,類對象內(nèi)部屬性dict中'x'對應(yīng)的值,在每創(chuàng)建一個對象時都發(fā)生了變化。也就是說,在每次創(chuàng)建類對象時,變量x引用內(nèi)存的初始值是不同的,這終要歸因于列表(list)的可變性導(dǎo)致的。每次創(chuàng)建對象時,因為列表的可變性,函數(shù)對象b的dict屬性中,x鍵對應(yīng)的值,被改變,而不是重新創(chuàng)建,所以出現(xiàn)了上面的結(jié)果。
綜上:初學(xué)者如果不充分理解python的變量和類型和參數(shù)傳遞方式,或者是一切解釋對象的原理,會很容易產(chǎn)生上面的錯誤。
以上這篇python變量賦值方法(可變與不可變)就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Python在Windows和在Linux下調(diào)用動態(tài)鏈接庫的教程
這篇文章主要介紹了Python在Windows和在Linux下調(diào)用動態(tài)鏈接庫的教程,在進行Python的CS端編程時經(jīng)常需要用到,需要的朋友可以參考下2015-08-08
Python使用LSTM實現(xiàn)銷售額預(yù)測詳解
大家經(jīng)常會遇到一些需要預(yù)測的場景,比如預(yù)測品牌銷售額,預(yù)測產(chǎn)品銷量。本文給大家分享一波使用?LSTM?進行端到端時間序列預(yù)測的完整代碼和詳細解釋,需要的可以參考一下2022-07-07
Python學(xué)習(xí)之流程控制與條件判斷總結(jié)
這篇文章主要為大家介紹了Python中的流程控制與條件判斷,文中的示例代碼講解詳細,對我們學(xué)習(xí)Python有一定幫助,需要的可以參考一下2022-03-03

