最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python基礎(chǔ)之變量的相關(guān)知識(shí)總結(jié)

 更新時(shí)間:2021年06月23日 10:20:16   作者:自動(dòng)化代碼美學(xué)  
今天給大家?guī)?lái)的是關(guān)于Python的相關(guān)知識(shí),文章圍繞著Python變量展開(kāi),文中有非常詳細(xì)的介紹及代碼示例,需要的朋友可以參考下

變量全都是引用

跟其他編程語(yǔ)言不同,Python的變量不是盒子,不會(huì)存儲(chǔ)數(shù)據(jù),它們只是引用,就像標(biāo)簽一樣,貼在對(duì)象上面。

比如:

>>> a = [1, 2, 3]
>>> b = a
>>> a.append(4)
>>> b
[1, 2, 3, 4]
>>> b is a
True

a變量和b變量引用的是同一個(gè)列表[1, 2, 3]。b可以叫做a的別名。

比較來(lái)看:

>>> a = [1, 2, 3]
>>> c = [1, 2, 3]
>>> c == a
True
>>> c is a
False

c引用的是另外一個(gè)列表,雖然和a引用的列表的值相等,但是它們是不同的對(duì)象。

淺復(fù)制與深復(fù)制

淺復(fù)制是指只復(fù)制最外層容器,副本中的元素是源容器中元素的引用。如果所有元素都是不可變的,那么這樣沒(méi)有問(wèn)題,還能節(jié)省內(nèi)容。但是,如果有可變的元素,那么結(jié)果可能會(huì)出乎意料之外。構(gòu)造方法或[:]做的都是淺復(fù)制。

示例:

>>> x1 = [3, [66, 55, 44], (7, 8, 9)]
# x2是x1的淺復(fù)制
>>> x2 = list(x1)

# 不可變?cè)貨](méi)有影響
>>> x1.append(100)
>>> x1
[3, [66, 55, 44], (7, 8, 9), 100]
>>> x2
[3, [66, 55, 44], (7, 8, 9)]  

# x1[1]是列表,可變?cè)貢?huì)影響x2
# 因?yàn)樗鼈円玫氖峭粋€(gè)對(duì)象
>>> x1[1].remove(55)
>>> x1
[3, [66, 44], (7, 8, 9), 100]
>>> x2
[3, [66, 44], (7, 8, 9)]  

# x2[1]也會(huì)反過(guò)來(lái)影響x1
>>> x2[1] += [33, 22]
>>> x1
[3, [66, 44, 33, 22], (7, 8, 9), 100]  
>>> x2
[3, [66, 44, 33, 22], (7, 8, 9)]

# 不可變?cè)M也不會(huì)有影響
# +=運(yùn)算符創(chuàng)建了一個(gè)新元組
>>> x2[2] += (10, 11)
>>> x1
[3, [66, 44, 33, 22], (7, 8, 9), 100]  
>>> x2
[3, [66, 44, 33, 22], (7, 8, 9, 10, 11)]

深復(fù)制是指我們常規(guī)理解的復(fù)制,副本不共享內(nèi)部對(duì)象的引用,是完全獨(dú)立的一個(gè)副本。這可以借助copy.deepcopy來(lái)實(shí)現(xiàn)。

示例:

>>> a = [10, 20]
>>> b = [a, 30]
>>> a.append(b)
>>> a
[10, 20, [[...], 30]]
>>> from copy import deepcopy
>>> c = deepcopy(a)
>>> c
[10, 20, [[...], 30]]

即使是有循環(huán)引用也能正確復(fù)制。

注意copy.copy()是淺復(fù)制,copy.deepcopy()是深復(fù)制。

函數(shù)傳參

Python唯一支持的參數(shù)傳遞模式是共享傳參,也就是指函數(shù)的各個(gè)形式參數(shù)獲得實(shí)參中各個(gè)引用的副本。因?yàn)镻ython的變量全都是引用。對(duì)于不可變對(duì)象來(lái)說(shuō)沒(méi)有問(wèn)題,但是對(duì)于可變對(duì)象就不一樣了。

示例:

>>> def f(a, b):
...     a += b
...     return a
... 

# 數(shù)字不變
>>> x = 1
>>> y = 2
>>> f(x, y)
3
>>> x, y
(1, 2)

# 列表變了
>>> a = [1, 2]
>>> b = [3, 4]
>>> f(a, b)
[1, 2, 3, 4]
>>> a, b
([1, 2, 3, 4], [3, 4])

# 元組不變
>>> t = (10, 20)
>>> u = (30, 40)
>>> f(t, u)
(10, 20, 30, 40)
>>> t, u
((10, 20), (30, 40))

由此可以得出一條警示:函數(shù)參數(shù)盡量不要使用可變參數(shù),如果非用不可,應(yīng)該考慮在函數(shù)內(nèi)部進(jìn)行復(fù)制。

示例:

class TwilightBus:
    """A bus model that makes passengers vanish"""

    def __init__(self, passengers=None):
        if passengers is None:
            self.passengers = []
        else:
            self.passengers = passengers

    def pick(self, name):
        self.passengers.append(name)

    def drop(self, name):
        self.passengers.remove(name)

測(cè)試一下:

>>> basketball_team = ['Sue', 'Tina', 'Maya', 'Diana', 'Pat']
>>> bus = TwilightBus(basketball_team)
>>> bus.drop('Tina')
>>> bus.drop('Pat')
>>> basketball_team
['Sue', 'Maya', 'Diana']

TwilightBus下車(chē)的學(xué)生,竟然從basketball_team中消失了。這是因?yàn)閟elf.passengers引用的是同一個(gè)列表對(duì)象。修改方法很簡(jiǎn)單,復(fù)制個(gè)副本:

 def __init__(self, passengers=None):
        if passengers is None:
            self.passengers = []
        else:
            self.passengers = list(passengers)  # 使用構(gòu)造函數(shù)復(fù)制副本

del和垃圾回收

del語(yǔ)句刪除的是引用,而不是對(duì)象。但是del可能會(huì)導(dǎo)致對(duì)象沒(méi)有引用,進(jìn)而被當(dāng)做垃圾回收。

示例:

>>> import weakref
>>> s1 = {1, 2, 3}
# s2和s1引用同一個(gè)對(duì)象
>>> s2 = s1
>>> def bye():
...     print("Gone")
...     
# 監(jiān)控對(duì)象和調(diào)用回調(diào)
>>> ender = weakref.finalize(s1, bye)
>>> ender.alive
True
# 刪除s1后還存在s2引用
>>> del s1
>>> ender.alive
True
# s2重新綁定導(dǎo)致{1, 2, 3}引用歸零
>>> s2 = "spam"
Gone
# 對(duì)象被銷(xiāo)毀了
>>> ender.alive
False

在CPython中,對(duì)象的引用數(shù)量歸零后,對(duì)象會(huì)被立即銷(xiāo)毀。如果除了循環(huán)引用之外沒(méi)有其他引用,兩個(gè)對(duì)象都會(huì)被銷(xiāo)毀。

弱引用

某些情況下,可能需要保存對(duì)象的引用,但不留存對(duì)象本身。比如,有個(gè)類(lèi)想要記錄所有實(shí)例。這個(gè)需求可以使用弱引用實(shí)現(xiàn)。

比如上面示例中的weakref.finalize(s1, bye),finalize就持有{1, 2, 3}的弱引用,雖然有引用,但是不會(huì)影響對(duì)象被銷(xiāo)毀。

其他使用弱引用的方式是WeakDictionary、WeakValueDictionary、WeakSet。

示例:

class Cheese:

    def __init__(self, kind):
        self.kind = kind

    def __repr__(self):
        return 'Cheese(%r)' % self.kind
>>> import weakref
>>> stock = weakref.WeakValueDictionary()
>>> catalog = [Cheese('Red Leicester'), Cheese('Tilsit'),
...                 Cheese('Brie'), Cheese('Parmesan')]
...
>>> for cheese in catalog:
        # 用作緩存
        # key是cheese.kind
        # value是cheese的弱引用
...     stock[cheese.kind] = cheese
...
>>> sorted(stock.keys())
['Brie', 'Parmesan', 'Red Leicester', 'Tilsit']

# 刪除catalog引用,stock弱引用不影響垃圾回收
# WeakValueDictionary的值引用的對(duì)象被銷(xiāo)毀后,對(duì)應(yīng)的鍵也會(huì)自動(dòng)刪除
>>> del catalog
>>> sorted(stock.keys())  # 還存在一個(gè)cheese臨時(shí)變量的引用
['Parmesan']

# 刪除cheese臨時(shí)變量的引用,stock就完全清空了
>>> del cheese
>>> sorted(stock.keys())
[]

注意不是每個(gè)Python對(duì)象都可以作為弱引用的目標(biāo),比如基本的list和dict就不可以,但是它們的子類(lèi)是可以的:

class MyList(list):
    pass
a_list = MyList(range(10))
weakref_to_a_list = weakref.ref(a_list)

小結(jié)

本文首先闡述了Python變量全部都是引用的這個(gè)事實(shí),這意味著在Python中,簡(jiǎn)單的賦值是不創(chuàng)建副本的。如果要?jiǎng)?chuàng)建副本,可以選擇淺復(fù)制和深復(fù)制,淺復(fù)制使用構(gòu)造方法、[:]copy.copy(),深復(fù)制使用copy.deepcopy()。del刪除的是引用,但是會(huì)導(dǎo)致對(duì)象沒(méi)有引用而被當(dāng)做垃圾回收。有時(shí)候需要保留引用而不保留對(duì)象(比如緩存),這叫做弱引用,weakref庫(kù)提供了相應(yīng)的實(shí)現(xiàn)。

參考資料:

《流暢的Python》

到此這篇關(guān)于Python基礎(chǔ)之變量的相關(guān)知識(shí)總結(jié)的文章就介紹到這了,更多相關(guān)Python變量?jī)?nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • python 編寫(xiě)簡(jiǎn)單網(wǎng)頁(yè)服務(wù)器的實(shí)例

    python 編寫(xiě)簡(jiǎn)單網(wǎng)頁(yè)服務(wù)器的實(shí)例

    今天小編就為大家分享一篇python 編寫(xiě)簡(jiǎn)單網(wǎng)頁(yè)服務(wù)器的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-06-06
  • pandas中df.rename()的具體使用

    pandas中df.rename()的具體使用

    本文主要介紹了pandas中df.rename()的具體使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-08-08
  • 淺談python print(xx, flush = True) 全網(wǎng)最清晰的解釋

    淺談python print(xx, flush = True) 全網(wǎng)最清晰的解釋

    今天小編就為大家分享一篇淺談python print(xx, flush = True) 全網(wǎng)最清晰的解釋?zhuān)哂泻芎玫膮⒖純r(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-02-02
  • Python?pyqt5下拉多選框的實(shí)現(xiàn)示例

    Python?pyqt5下拉多選框的實(shí)現(xiàn)示例

    QComboBox是一個(gè)集按鈕和下拉選項(xiàng)于一體的控件,本文主要介紹了Python?pyqt5下拉多選框的實(shí)現(xiàn)示例,具有一定的參考價(jià)值,感興趣的可以了解一下
    2025-04-04
  • Python3.10接入ChatGPT實(shí)現(xiàn)逐句回答流式返回

    Python3.10接入ChatGPT實(shí)現(xiàn)逐句回答流式返回

    這篇文章主為大家要介紹了Python3.10接入ChatGPT實(shí)現(xiàn)逐句回答流式返回示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-03-03
  • 詳解Python如何利用Pandas與NumPy進(jìn)行數(shù)據(jù)清洗

    詳解Python如何利用Pandas與NumPy進(jìn)行數(shù)據(jù)清洗

    許多數(shù)據(jù)科學(xué)家認(rèn)為獲取和清理數(shù)據(jù)的初始步驟占工作的 80%,花費(fèi)大量時(shí)間來(lái)清理數(shù)據(jù)集并將它們歸結(jié)為可以使用的形式。本文將利用 Python 的 Pandas和 NumPy 庫(kù)來(lái)清理數(shù)據(jù),需要的可以參考一下
    2022-04-04
  • Python學(xué)習(xí)小技巧總結(jié)

    Python學(xué)習(xí)小技巧總結(jié)

    本篇文章給大家總結(jié)了關(guān)于python相關(guān)知識(shí)點(diǎn)學(xué)習(xí)的技巧以及難點(diǎn),有興趣的朋友可以參考學(xué)習(xí)下。
    2018-06-06
  • python占位符輸入方式實(shí)例

    python占位符輸入方式實(shí)例

    在本篇文章中小編給大家分享了關(guān)于python占位符怎么輸入的相關(guān)知識(shí)點(diǎn)內(nèi)容,有興趣的朋友們可以學(xué)習(xí)下。
    2019-05-05
  • python實(shí)現(xiàn)股票歷史數(shù)據(jù)可視化分析案例

    python實(shí)現(xiàn)股票歷史數(shù)據(jù)可視化分析案例

    股票交易數(shù)據(jù)分析可直觀股市走向,對(duì)于如何把握股票行情,快速解讀股票交易數(shù)據(jù)有不可替代的作用,感興趣的可以了解一下
    2021-06-06
  • python正則表達(dá)式re.group()用法

    python正則表達(dá)式re.group()用法

    本文主要介紹了python正則表達(dá)式re.group()用法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-08-08

最新評(píng)論

饶阳县| 商水县| 大理市| 缙云县| 沙坪坝区| 从化市| 万载县| 山东| 长垣县| 平邑县| 铁力市| 拉萨市| 宁国市| 马山县| 修武县| 灌云县| 郯城县| 游戏| 治多县| 莱芜市| 徐水县| 平潭县| 大石桥市| 曲麻莱县| 监利县| 乐亭县| 齐河县| 叶城县| 十堰市| 清水县| 武隆县| 盘锦市| 梁平县| 富平县| 常山县| 波密县| 来安县| 四平市| 万载县| 大渡口区| 宝兴县|