您好,登錄后才能下訂單哦!
這篇文章給大家分享的是有關(guān)Python變量的知識(shí)點(diǎn)分析的內(nèi)容。小編覺(jué)得挺實(shí)用的,因此分享給大家做個(gè)參考,一起跟隨小編過(guò)來(lái)看看吧。
在大多數(shù)語(yǔ)言中,為一個(gè)值起一個(gè)名字時(shí),把這種行為稱(chēng)為“給變量賦值”或“把值存儲(chǔ)在變量中”。不過(guò),Python與許多其它計(jì)算機(jī)語(yǔ)言的有所不同,它并不是把值存儲(chǔ)在變量中,而像是把名字“貼”在值的上邊(專(zhuān)業(yè)一點(diǎn)說(shuō)法是將名字綁定了對(duì)象)。所以,有些Python程序員會(huì)說(shuō)Python沒(méi)有變量,只有名字,通過(guò)名字找到它代表的值。
Python中的變量,與其它開(kāi)發(fā)語(yǔ)言(如C語(yǔ)言)的不同:
在C語(yǔ)言中,變量類(lèi)似于一個(gè)“容器”,賦給它的值,裝在容器中:
定義一個(gè)變量 int a = 1;
給變量a重新賦值 a = 2;
把變量a賦值給另外一個(gè)變量b ,int b = a;
會(huì)重新創(chuàng)建一個(gè)變量b(容器),將a中的內(nèi)容復(fù)制粘貼至b中。
在python中,變量類(lèi)似于名字標(biāo)簽“貼”在值上面,通過(guò)名字找到它代表的值。
定義一個(gè)變量 a = 1
給變量a重新賦值 a = 2
把變量a賦值給另外一個(gè)變量b, b = a
創(chuàng)建新的便利貼b,與a同時(shí)貼到值上
為了對(duì)python中變量的這種情況加深認(rèn)識(shí),下面適度展開(kāi)介紹。
先說(shuō)明第一點(diǎn):變量的實(shí)現(xiàn)方式有:引用語(yǔ)義、值語(yǔ)義
python語(yǔ)言中變量的實(shí)現(xiàn)方式就是引用語(yǔ)義,在變量里面保存的是值(對(duì)象)的引用(值所在處內(nèi)存空間的地址)。采用這種方式,變量所需的存儲(chǔ)空間大小一致,因?yàn)槠渲兄恍枰4嬉粋€(gè)引用。而有些語(yǔ)言(例如c)采用的不是這種方式,它們把變量直接保存在變量的存儲(chǔ)區(qū)里,這種方式就稱(chēng)為值語(yǔ)義。這樣的話,一個(gè)整數(shù)類(lèi)型的變量就需要保存一個(gè)整數(shù)所需要的空間(例如c語(yǔ)言中int類(lèi)型占用4個(gè)字節(jié)大小)。
python中變量與對(duì)象的引用關(guān)系類(lèi)似于c語(yǔ)言的指針變量與指向地址之間的關(guān)系。
在python的數(shù)據(jù)結(jié)構(gòu)中,對(duì)象分為可變對(duì)象和不可變對(duì)象?;緮?shù)據(jù)類(lèi)型如int、float,元祖tuple、str是不可變對(duì)象;list(列表)、dict(字典)、set(集合)是可變對(duì)象,可變對(duì)象存儲(chǔ)的元素的引用其實(shí)是沒(méi)有改變的,改變的是其引用指向的值。
采用引用語(yǔ)義存儲(chǔ)的只是一個(gè)變量的值所在的內(nèi)存地址,而不是這個(gè)變量的值本身。
現(xiàn)在說(shuō)明第二點(diǎn):Python中的變量、對(duì)象、引用三者之間的關(guān)系。
在Python里一切皆對(duì)象。Python中,對(duì)象具有三要素:標(biāo)識(shí)(identity)、類(lèi)型(type)、值(value)。
☆標(biāo)識(shí)(identity):
用于唯一標(biāo)識(shí)對(duì)象,通常對(duì)應(yīng)對(duì)象在計(jì)算機(jī)內(nèi)存中的地址。使用內(nèi)置函數(shù)id(obj)返回對(duì)象唯一標(biāo)識(shí)。
☆類(lèi)型(type):
類(lèi)型可以限制對(duì)象的取值范圍和可執(zhí)行的操作。使用內(nèi)置函數(shù)type(obj)返回對(duì)象所屬類(lèi)型。
對(duì)象中含有標(biāo)準(zhǔn)的頭部信息:類(lèi)型標(biāo)識(shí)符。標(biāo)識(shí)對(duì)象類(lèi)型,表示對(duì)象存儲(chǔ)的數(shù)據(jù)的類(lèi)型。
每一個(gè)對(duì)象都有兩個(gè)標(biāo)準(zhǔn)的頭部信息:
1.類(lèi)型標(biāo)識(shí)符,去標(biāo)識(shí)對(duì)象的(數(shù)據(jù))類(lèi)型;
2.引用計(jì)數(shù)器,記錄當(dāng)前對(duì)象的引用的數(shù)目。
(回收機(jī)制:變量的引用計(jì)數(shù)器為0,自動(dòng)清理。 ※ 較小整數(shù)型對(duì)象有緩存機(jī)制。)
☆值(value):
表示對(duì)象存儲(chǔ)的數(shù)據(jù)的信息。使用內(nèi)置函數(shù)print(obj)可以直接打印值。
Python中,變量用來(lái)指向任意的對(duì)象,是對(duì)象的引用。Python變量更像是指針(或者說(shuō)Python變量更像“貼簽”),而不是數(shù)據(jù)存儲(chǔ)區(qū)域(而不是數(shù)據(jù)“容器”)。
Python 中的變量不是裝有對(duì)象的“容器”,而是貼在對(duì)象上的“標(biāo)簽”——給一個(gè)變量賦值,把這個(gè)標(biāo)簽貼到一個(gè)對(duì)象上,重新賦值,是撕下標(biāo)簽貼到另一個(gè)對(duì)象上。
在python中,變量保存的是對(duì)象(值)的引用,采用這種方式,變量的每一次初始化,都開(kāi)辟了一個(gè)新的空間,將新內(nèi)容的地址賦值給變量。id()函數(shù)可以獲取變量在內(nèi)存中的地址。我們把不同的值賦給變量時(shí)候,地址發(fā)生變化,相同的值地址不發(fā)生變化。下面給出示例:
【順便提示:id()的值不是固定不變的——此值系統(tǒng)為對(duì)象分配的內(nèi)存地址,在你練習(xí)時(shí)顯示的不同值是正常的?!?/p>
下面是字符串的示例:
在Python中,值可以放在內(nèi)存的某個(gè)位置(地址),變量用于引用它們,給變量賦一個(gè)新值,原值不會(huì)被新值覆蓋,變量只是引用了新值。順便說(shuō)明,Python的垃圾回收機(jī)制會(huì)自動(dòng)清理不再被用到的值,所以不用擔(dān)心計(jì)算機(jī)內(nèi)存中充滿被“丟棄”的無(wú)效的值。
現(xiàn)在說(shuō)明第三點(diǎn):可變(mutable) 類(lèi)型對(duì)象、不可變(immutable) 類(lèi)型對(duì)象
可變類(lèi)型對(duì)象,指對(duì)象可以在其 id() 保持固定的情況下改變其取值。
不可變類(lèi)型對(duì)象,指具有固定值的對(duì)象。不可變對(duì)象包括數(shù)字(numbers)、字符串(strings)和元組(tuples)。這樣的對(duì)象不能被改變。如果必須存儲(chǔ)一個(gè)不同的值,則必須創(chuàng)建新的對(duì)象。不可變對(duì)象不允許對(duì)自身內(nèi)容進(jìn)行修改。如果我們對(duì)一個(gè)不可變對(duì)象進(jìn)行賦值,實(shí)際上是生成一個(gè)新對(duì)象,再讓變量指向這個(gè)對(duì)象。哪怕這個(gè)對(duì)象簡(jiǎn)單到只是數(shù)字 0 和 1。
由于 Python 中的變量存放的是對(duì)象引用,所以對(duì)于不可變對(duì)象而言,盡管對(duì)象本身不可變,但變量的對(duì)象引用是可變的。運(yùn)用這樣的機(jī)制,有時(shí)候會(huì)讓人產(chǎn)生糊涂,似乎可變對(duì)象變化了。如下面的代碼:
i = 73
i += 2
不可變的對(duì)象的特征沒(méi)有變,依然是不可變對(duì)象,變的只是創(chuàng)建了新對(duì)象,改變了變量的對(duì)象引用。參見(jiàn)下圖:
對(duì)于可變對(duì)象,其對(duì)象的內(nèi)容是可以變化的。當(dāng)對(duì)象的內(nèi)容發(fā)生變化時(shí),變量的對(duì)象引用是不會(huì)變化的。如下面的例子。
m=[5,9]
m+=[6]
參見(jiàn)下圖:
Python變量指的是名字綁定了對(duì)象(綁定就是將一個(gè)對(duì)象與一個(gè)名字聯(lián)系起來(lái))。
綁定時(shí),變量就是名字。
使用時(shí),變量代表對(duì)象的引用。
變量改變的只有綁定關(guān)系。
深入學(xué)習(xí):
https://docs.python.org/zh-cn/3.9/reference/datamodel.html#objects-values-and-types
補(bǔ)充說(shuō)明:
對(duì)復(fù)雜的數(shù)據(jù)類(lèi)型(列表、集合、字典),如果添加某一項(xiàng)元素,或者添加幾個(gè)元素,不會(huì)改變其本身的地址,只會(huì)改變其內(nèi)部元素的地址引用,但是如果對(duì)其重新賦值時(shí),就會(huì)重新賦予地址覆蓋就地址,這時(shí)地址就會(huì)發(fā)生改變。示例代碼如下:
list_ = [1,2,3,4] print(list_, id(list_)) list_.append(5) print(list_, id(list_)) #如上代碼,因?yàn)閍ppend前后的list_仍然是同一個(gè)對(duì)象,只是對(duì)象的值發(fā)了改變,所以地址不變。 #再如下面的代碼 print(list_, id(list_), id(list_[1]))#打印列表、列表的地址、第二個(gè)元素的地址 list_[1] = 'aaa' #修改列表 print(list_, id(list_), id(list_[1]))#打印列表、列表的地址、第二個(gè)元素的地址 #不難發(fā)發(fā)現(xiàn):列表變了、列表的地址沒(méi)有變、列表內(nèi)部元素變了、列表內(nèi)部元素的地址變了
測(cè)試運(yùn)行如下圖所示:
Python是一種跨平臺(tái)的、具有解釋性、編譯性、互動(dòng)性和面向?qū)ο蟮哪_本語(yǔ)言,其最初的設(shè)計(jì)是用于編寫(xiě)自動(dòng)化腳本,隨著版本的不斷更新和新功能的添加,常用于用于開(kāi)發(fā)獨(dú)立的項(xiàng)目和大型項(xiàng)目。
感謝各位的閱讀!關(guān)于“Python變量的知識(shí)點(diǎn)分析”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,讓大家可以學(xué)到更多知識(shí),如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到吧!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。