1. <ul id="jtofd"><meter id="jtofd"></meter></ul>
      <ul id="jtofd"><meter id="jtofd"></meter></ul><strike id="jtofd"><label id="jtofd"></label></strike>

      IT系統(tǒng)集成商

      系統(tǒng)集成 | 虛擬化應(yīng)用 | 群暉網(wǎng)絡(luò)存儲(chǔ) | 視頻會(huì)議 | 數(shù)據(jù)防泄密 | 技術(shù)運(yùn)維

      手機(jī): 130-1534-6247   電話: 0351-2396570

      Python筆記1-變量與對(duì)象

      關(guān)注億維訊達(dá)
      關(guān)注億維訊達(dá)

      一、Python 中,一切皆對(duì)象。每個(gè)對(duì)象由:標(biāo)識(shí)(identity)、類型(type)、value(值)組成。
      1. 標(biāo)識(shí)用于唯一標(biāo)識(shí)對(duì)象。使用內(nèi)置函數(shù) id(obj)可返回對(duì)象 obj 的標(biāo)識(shí)。
      2. 類型用于表示對(duì)象存儲(chǔ)的“數(shù)據(jù)”的類型?梢允褂 type(obj)獲得對(duì)象的所屬類型。
      3. 值表示對(duì)象所存儲(chǔ)的數(shù)據(jù)的信息。使用 print(obj)可以直接打印出值。
      4. Python 是動(dòng)態(tài)類型語(yǔ)言,變量不需要顯式聲明類型。根據(jù)變量引用的對(duì)象,Python 解釋器自動(dòng)確定數(shù)據(jù)類型。
      5. Python 是強(qiáng)類型語(yǔ)言,每個(gè)對(duì)象都有數(shù)據(jù)類型,只支持該類型支持的操作。
       
      二、賦值
       
      在 Python 中,變量也稱為對(duì)象的引用。變量引用“對(duì)象”。
      變量位于棧內(nèi)存。對(duì)象位于堆內(nèi)存。
       
      python 賦值
      變量盒子

      Python 賦值語(yǔ)句實(shí)際上與“變量盒子”模型略有不同。在 Python 中,值可能最終放在內(nèi)存中的任何位置,而變量用于引用它們。對(duì)變量賦值就像把一個(gè)黃色小粘貼便簽放在值上,并說(shuō)“這是 x”。
      python 賦值
      賦值就象貼標(biāo)簽
       
      上圖是一個(gè)更準(zhǔn)確的 Python 賦值的效果。箭頭用于顯示變量引用的值。舊值不會(huì)被新值擦除,變量只需重新綁定新值。效果就像將粘貼便簽從一個(gè)對(duì)象移動(dòng)到另一個(gè)對(duì)象一樣(重新綁定)。

      你也不必?fù)?dān)心計(jì)算機(jī)內(nèi)存中充滿“被丟棄”的值。如果一個(gè)值不再被任何變量引用,它就不再有用。 Python將自動(dòng)從內(nèi)存中清除這些值,以便空間可以用于存放新值。這個(gè)自動(dòng)內(nèi)存管理的過(guò)程確實(shí)被稱為“垃圾收集”。

      變量在使用前必須先進(jìn)行初始化,也就是將變量綁定在一個(gè)對(duì)象上,格式如:變量名 = 表達(dá)式。執(zhí)行過(guò)程中,解釋器先運(yùn)行右邊的表達(dá)式,在堆內(nèi)存中創(chuàng)建一個(gè)對(duì)象,然后將對(duì)象的內(nèi)存地址賦給左邊的變量。

      <section style="margin: 0px; padding: 0px; color: rgb(51, 51, 51); font-family: mp-quote, -apple-system-font, BlinkMacSystemFont, " helvetica="" neue",="" "pingfang="" sc",="" "hiragino="" sans="" gb",="" "microsoft="" yahei="" ui",="" yahei",="" arial,="" sans-serif;="" font-size:="" 17px;="" text-align:="" justify;="" text-indent:="" 2em;"=""> 為了簡(jiǎn)化內(nèi)存管理,Python通過(guò)引用計(jì)數(shù)機(jī)制實(shí)現(xiàn)自動(dòng)垃圾回收功能,Python中的每個(gè)對(duì)象都有一個(gè)引用計(jì)數(shù),用來(lái)計(jì)數(shù)該對(duì)象在不同場(chǎng)所分別被引用了多少次。每當(dāng)引用一次Python對(duì)象,相應(yīng)的引用計(jì)數(shù)就增1,每當(dāng)消毀一次Python對(duì)象,則相應(yīng)的引用就減1,只有當(dāng)引用計(jì)數(shù)為零時(shí),才真正從內(nèi)存中刪除Python對(duì)象。

       

      不要將is用于數(shù)和字符串等不可變的基本值。鑒于Python在內(nèi)部處理這些對(duì)象時(shí)可能會(huì)采用“small integer cache”的方式,將一些小整數(shù)、字符串等不可變對(duì)象只保留一份拷貝,這樣做的結(jié)果是不可預(yù)測(cè)的。
       
      三、 可變對(duì)象與不可變對(duì)象
       
      Python在heap中分配的對(duì)象分成2類:
        1. 不可變對(duì)象(immutable object):Number(int、float、bool、complex)、String、Tuple. 采用等效于“傳引用”的方式。
        2. 可變對(duì)象(mutable object):List、dictionary.采用等效于“傳值”的方式。
       
      四、關(guān)于參數(shù)傳遞
       
      在編程語(yǔ)言設(shè)計(jì)中,有兩種常見(jiàn)的范例將參數(shù)傳遞給函數(shù):
          傳遞值:參數(shù)的副本傳遞給函數(shù)。
          傳遞引用:對(duì)參數(shù)的引用將傳遞給函數(shù)。
       
      Python中的參數(shù)是按值傳遞還是按引用傳遞?答案是,兩者都不是。
       
      回想一下,在Python中,每條數(shù)據(jù)都是一個(gè)對(duì)象。引用指向一個(gè)對(duì)象,而不是一個(gè)特定的內(nèi)存位置。
      在Python中,類似的賦值語(yǔ)句如下:
       
      x = 5
      x = 10
      這些賦值語(yǔ)句具有以下含義:
       
      第一條語(yǔ)句導(dǎo)致x指向一個(gè)值為的對(duì)象5。
      下x一條語(yǔ)句重新分配為值為的另一個(gè)對(duì)象的新引用10。換句話說(shuō),第二個(gè)賦值重新綁定x到具有value的另一個(gè)對(duì)象10。
      在Python中,當(dāng)您將參數(shù)傳遞給函數(shù)時(shí),會(huì)發(fā)生類似的重新綁定?紤]以下示例:
       
      def f(fx):
          fx = 10
       
      x = 5
      f(x)
      ---------------------
      >>>x
      >>>5
      在主程序中,第x = 5的語(yǔ)句創(chuàng)建一個(gè)名為x的引用,該引用x綁定到一個(gè)值為的對(duì)象5。然后x作為參數(shù)調(diào)用f()。當(dāng)f()第一次啟動(dòng)時(shí),一個(gè)叫做fx新的引用被創(chuàng)建,它最初指向對(duì)象x(也就是5)
       
      python參數(shù)傳遞
       
      函數(shù)調(diào)用圖
       
      但是,在執(zhí)行fx = 10的語(yǔ)句時(shí),將fx重新綁定 到值為10的新對(duì)象。x和fx這兩個(gè)引用相互分離。沒(méi)有影響主程序中的x,并且在f()終止x時(shí)仍會(huì)指向該對(duì)象5,就像在函數(shù)調(diào)用之前一樣:
      python參數(shù)傳遞
       
      Python函數(shù)調(diào)用
       
      可以使用id()確認(rèn)。顯示了所涉及對(duì)象的數(shù)字標(biāo)識(shí)符:
       
      >>> def f(fx):
       2 ...     print('fx =', fx, '/ id(fx) = ', id(fx))
       3 ...     fx = 10
       4 ...     print('fx =', fx, '/ id(fx) = ', id(fx))
       5 ...
       6 
       7 >>> x = 5
       8 >>> print('x =', x, '/ id(x) = ', id(x))
       9 x = 5 / id(x) =  1357924048
      10 
      11 >>> f(x)
      12 fx = 5 / id(fx) =  1357924048
      13 fx = 10 / id(fx) =  1357924128
      14 
      15 >>> print('x =', x, '/ id(x) = ', id(x))
      16 x = 5 / id(x) =  1357924048
      當(dāng)f()第一次啟動(dòng),fx與x都指向同一個(gè)對(duì)象,它id()是1357924048。f()執(zhí)行語(yǔ)句fx = 10后,fx指向不同的對(duì)象,它id()是1357924128。調(diào)用環(huán)境中與原始對(duì)象的連接丟失。
       
      Python中的參數(shù)傳遞在某種程度上是按值傳遞和按引用傳遞之間的混合。傳遞給函數(shù)的是對(duì)對(duì)象的引用,但該引用是按值傳遞的。
       
      注意: Python的參數(shù)傳遞機(jī)制稱為pass-by-assignment。這是因?yàn)閰?shù)名稱綁定到Python中函數(shù)輸入上的對(duì)象,并且賦值也是將名稱綁定到對(duì)象的過(guò)程。您可能還會(huì)看到術(shù)語(yǔ)“按對(duì)象傳遞”,“按對(duì)象傳遞引用”或“按共享傳遞”。
       
      這里的關(guān)鍵要點(diǎn)是,Python函數(shù)無(wú)法通過(guò)將相應(yīng)的參數(shù)重新分配給其他東西來(lái)更改參數(shù)的值。下面的示例演示了這一點(diǎn):
      >>> def f(x):
      ...     x = 'foo'
      ...
      >>> for i in (40,dict(foo=1, bar=2),{1, 2, 3},'bar',['foo', 'bar', 'baz']):
      ...     f(i)
      ...     print(i)
      ...
      40
      {'foo': 1, 'bar': 2}
      {1, 2, 3}
      bar
      ['foo', 'bar', 'baz']
      在這里,類型的對(duì)象int,dict,set,str,,list傳遞給f()作為參數(shù)。但是正如您所看到的,一旦回到調(diào)用環(huán)境中,它們都保持不變。一旦f()執(zhí)行任務(wù)x = 'foo',將被重新綁定,原始對(duì)象的連接丟失。
       
      這是否意味著Python函數(shù)根本無(wú)法修改其參數(shù)?其實(shí)不,不是這樣!注意這里發(fā)生的情況:
       
      >>> def f(x):
      ...     x[0] = '---'
      ...
      
      >>> my_list = ['foo', 'bar', 'baz', 'qux']
      
      >>> f(my_list)
      >>> my_list
      ['---', 'bar', 'baz', 'qux']
      在這種情況下,f()參數(shù)是list。當(dāng)f()被調(diào)用時(shí),一個(gè)引用my_list被傳遞。您已經(jīng)看到f()無(wú)法重新分配my_list。但是,f()可以在內(nèi)部使用引用進(jìn)行修改my_list。在這里,f()已經(jīng)修改了第一個(gè)元素。您可以看到,函數(shù)一旦返回,my_list實(shí)際上在調(diào)用環(huán)境中已被更改。相同的概念適用于字典:
       
      >>> def f(x):
      ...     x['bar'] = 22
      ...
      
      >>> my_dict = {'foo': 1, 'bar': 2, 'baz': 3}
      
      >>> f(my_dict)
      >>> my_dict
      {'foo': 1, 'bar': 22, 'baz': 3}
      在這里,f()修改了my_dict。該更改反映在f()返回后的調(diào)用環(huán)境中。
       
      參數(shù)傳遞摘要
       
      Python中傳遞的參數(shù)可以總結(jié)如下。傳遞一個(gè)不可變的對(duì)象,像int,str,tuple,或frozenset,傳遞給Python函數(shù)的行為類似于按值傳遞。該函數(shù)無(wú)法在調(diào)用環(huán)境中修改對(duì)象。傳遞一個(gè)可變的對(duì)象,比如list、dict或set,可以起到類似于引用傳遞的作用,但不完全是這樣。該函數(shù)不能完全重新分配對(duì)象,但它可以在對(duì)象中適當(dāng)?shù)馗捻?xiàng),這些更改將反映在調(diào)用環(huán)境中。
      關(guān)注億維訊達(dá)
      關(guān)注億維訊達(dá)