欧美阿v视频在线大全_亚洲欧美中文日韩V在线观看_www性欧美日韩欧美91_亚洲欧美日韩久久精品

主頁 > 知識庫 > Python基礎之變量的相關知識總結

Python基礎之變量的相關知識總結

熱門標簽:老人電話機器人 百度地圖標注位置怎么修改 梅州外呼業務系統 高德地圖標注是免費的嗎 地圖標注視頻廣告 無錫客服外呼系統一般多少錢 洪澤縣地圖標注 北京電信外呼系統靠譜嗎 大連crm外呼系統

變量全都是引用

跟其他編程語言不同,Python的變量不是盒子,不會存儲數據,它們只是引用,就像標簽一樣,貼在對象上面。

比如:

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

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

比較來看:

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

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

淺復制與深復制

淺復制是指只復制最外層容器,副本中的元素是源容器中元素的引用。如果所有元素都是不可變的,那么這樣沒有問題,還能節省內容。但是,如果有可變的元素,那么結果可能會出乎意料之外。構造方法或[:]做的都是淺復制。

示例:

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

# 不可變元素沒有影響
>>> x1.append(100)
>>> x1
[3, [66, 55, 44], (7, 8, 9), 100]
>>> x2
[3, [66, 55, 44], (7, 8, 9)]  

# x1[1]是列表,可變元素會影響x2
# 因為它們引用的是同一個對象
>>> x1[1].remove(55)
>>> x1
[3, [66, 44], (7, 8, 9), 100]
>>> x2
[3, [66, 44], (7, 8, 9)]  

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

# 不可變元組也不會有影響
# +=運算符創建了一個新元組
>>> 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)]

深復制是指我們常規理解的復制,副本不共享內部對象的引用,是完全獨立的一個副本。這可以借助copy.deepcopy來實現。

示例:

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

即使是有循環引用也能正確復制。

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

函數傳參

Python唯一支持的參數傳遞模式是共享傳參,也就是指函數的各個形式參數獲得實參中各個引用的副本。因為Python的變量全都是引用。對于不可變對象來說沒有問題,但是對于可變對象就不一樣了。

示例:

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

# 數字不變
>>> 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))

由此可以得出一條警示:函數參數盡量不要使用可變參數,如果非用不可,應該考慮在函數內部進行復制。

示例:

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)

測試一下:

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

TwilightBus下車的學生,竟然從basketball_team中消失了。這是因為self.passengers引用的是同一個列表對象。修改方法很簡單,復制個副本:

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

del和垃圾回收

del語句刪除的是引用,而不是對象。但是del可能會導致對象沒有引用,進而被當做垃圾回收。

示例:

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

在CPython中,對象的引用數量歸零后,對象會被立即銷毀。如果除了循環引用之外沒有其他引用,兩個對象都會被銷毀。

弱引用

某些情況下,可能需要保存對象的引用,但不留存對象本身。比如,有個類想要記錄所有實例。這個需求可以使用弱引用實現。

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

其他使用弱引用的方式是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的值引用的對象被銷毀后,對應的鍵也會自動刪除
>>> del catalog
>>> sorted(stock.keys())  # 還存在一個cheese臨時變量的引用
['Parmesan']

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

注意不是每個Python對象都可以作為弱引用的目標,比如基本的list和dict就不可以,但是它們的子類是可以的:

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

小結

本文首先闡述了Python變量全部都是引用的這個事實,這意味著在Python中,簡單的賦值是不創建副本的。如果要創建副本,可以選擇淺復制和深復制,淺復制使用構造方法、[:]copy.copy(),深復制使用copy.deepcopy()。del刪除的是引用,但是會導致對象沒有引用而被當做垃圾回收。有時候需要保留引用而不保留對象(比如緩存),這叫做弱引用,weakref庫提供了相應的實現。

參考資料:

《流暢的Python》

到此這篇關于Python基礎之變量的相關知識總結的文章就介紹到這了,更多相關Python變量內容請搜索腳本之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:
  • python定義變量類型
  • Python激活Anaconda環境變量的詳細步驟
  • python 實現兩個變量值進行交換的n種操作
  • Python全局變量global關鍵字詳解
  • python子類如何繼承父類的實例變量

標簽:清遠 吉林 岳陽 泉州 安慶 長春 洛陽 怒江

巨人網絡通訊聲明:本文標題《Python基礎之變量的相關知識總結》,本文關鍵詞  Python,基礎,之,變量,的,相關,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《Python基礎之變量的相關知識總結》相關的同類信息!
  • 本頁收集關于Python基礎之變量的相關知識總結的相關信息資訊供網民參考!
  • 推薦文章
    欧美阿v视频在线大全_亚洲欧美中文日韩V在线观看_www性欧美日韩欧美91_亚洲欧美日韩久久精品
  • <rt id="w000q"><acronym id="w000q"></acronym></rt>
  • <abbr id="w000q"></abbr>
    <rt id="w000q"></rt>
    亚洲国产三级在线| 爽好多水快深点欧美视频| 国产午夜精品理论片a级大结局| 一区二区三区四区精品在线视频| 精品一区二区在线观看| 欧美无人区码suv| 555夜色666亚洲国产免| 亚洲国产一区二区视频| 18禁一区二区三区| 欧美少妇bbb| 亚洲v精品v日韩v欧美v专区| 日本精品一二三| 欧美美女黄视频| 亚洲r级在线视频| 国产不卡一二三| 欧美一区二区三区白人| 蜜臀av亚洲一区中文字幕| 四虎永久免费影院| 26uuu亚洲综合色| 国产一区二区三区免费看| 永久免费毛片在线观看| 久久美女艺术照精彩视频福利播放| 精品系列免费在线观看| 国产精品麻豆一区| 国产精品人妖ts系列视频| 成人精品免费看| 在线看一区二区| 亚洲国产成人精品视频| 精品黑人一区二区三区观看时间| 久久这里只有精品视频网| 国产精品99久久不卡二区| 在线免费观看亚洲视频| 一区二区三区91| 天天躁日日躁狠狠躁免费麻豆| 欧美成人精品福利| 国产精品一线二线三线精华| 色综合久久九月婷婷色综合| 亚洲一区二区高清| 日本丰满少妇裸体自慰| 日本一区二区三区在线观看| 99re8在线精品视频免费播放| 欧美日韩国产另类一区| 蜜桃视频第一区免费观看| 天堂а√在线中文在线鲁大师| 亚洲色图欧洲色图| 亚洲视频在线播放免费| 久久精品一级爱片| 成人一区二区三区视频 | 欧美疯狂性受xxxxx喷水图片| 视频在线在亚洲| 欧美色图17p| 一区二区三区四区五区视频在线观看| 插我舔内射18免费视频| 亚洲精品一区在线观看| av成人动漫在线观看| 91精品国产综合久久久久久| 国产一区美女在线| 在线欧美日韩精品| 午夜国产不卡在线观看视频| 成人免费无码大片a毛片| 欧美日韩视频在线一区二区| 久久精品国产久精国产爱| 91视频免费在线看| 日韩电影免费在线观看网站| 男人的午夜天堂| 亚洲成人777| 91香蕉一区二区三区在线观看| 一卡二卡三卡日韩欧美| 娇妻被老王脔到高潮失禁视频| 亚洲激情欧美激情| 亚洲精品一区二区三区影院忠贞| 亚洲欧洲综合另类| 国产传媒国产传媒| 亚洲精选免费视频| 国产91丝袜美女在线播放| 艳妇臀荡乳欲伦亚洲一区| 黄色三级生活片| 亚洲国产精品久久人人爱 | 国产精品密蕾丝袜| 亚洲视频在线观看三级| 天天躁日日躁aaaa视频| 一二三区精品福利视频| 国产精品一区二区亚洲| 日韩和欧美的一区| 日本乱码高清不卡字幕| 国产制服丝袜一区| 欧美精品色综合| 成人午夜视频网站| 精品国产乱码久久久久久蜜臀| 少妇性l交大片7724com| 国产丝袜在线精品| 欧美深性狂猛ⅹxxx深喉| 亚洲精品国久久99热| 国产精品suv一区二区88| 免费人成在线不卡| 欧美色网一区二区| a级精品国产片在线观看| 日韩欧美不卡在线观看视频| 91在线你懂得| 欧美日韩视频在线第一区| 亚洲欧美偷拍三级| 91无套直看片红桃在线观看| 日韩国产在线一| 欧美日韩亚洲综合在线 欧美亚洲特黄一级| 国产精品香蕉一区二区三区| 精品精品国产高清一毛片一天堂| 蜜臀av粉嫩av懂色av| 一区二区视频在线| 中日韩一级黄色片| 韩国中文字幕2020精品| 欧美成人性福生活免费看| 黄色性视频网站| 夜夜精品浪潮av一区二区三区| 色婷婷精品久久二区二区蜜臀av| 国产高清精品网站| 久久精品这里都是精品| 人妻视频一区二区| 美腿丝袜亚洲综合| 日韩精品一区在线观看| jizz日本免费| 日韩av中文字幕一区二区三区| 777午夜精品视频在线播放| 99视频有精品| 最新国产精品久久精品| 日本美女黄色一级片| 狠狠色丁香久久婷婷综合丁香| 欧美一二三区在线观看| 中文在线一区二区三区| 91久久精品一区二区| 成人性生交大片免费看中文 | 91精品国产综合久久香蕉麻豆| 97中文字幕在线观看| 亚洲国产精品一区二区久久恐怖片 | 不卡av免费在线观看| 亚洲风情在线资源站| 91精品久久久久久蜜臀| 日本少妇xxxx| 国产伦精品一区二区三区视频青涩| 日韩一级在线观看| 老司机福利av| 极品少妇xxxx精品少妇| 久久精品人人做人人爽人人| 黄色av片三级三级三级免费看| 国产电影精品久久禁18| 中文字幕一区二区三区av| 色女孩综合影院| 免费黄色在线播放| 亚洲成人精品一区二区| 日韩午夜av一区| 欧美亚洲色综久久精品国产| 国产91富婆露脸刺激对白| 亚洲日本丝袜连裤袜办公室| 精品视频在线免费看| 日本免费福利视频| 国产美女久久久久| 成人免费在线播放视频| 欧美日韩综合不卡| 中文字幕在线免费看线人| 韩国成人精品a∨在线观看| 国产精品伦理一区二区| 欧美亚洲高清一区| 特大黑人巨人吊xxxx| 国产传媒久久文化传媒| 樱花草国产18久久久久| 欧美一级黄色大片| 美女三级黄色片| 久久久久中文字幕亚洲精品| 麻豆精品一二三| 国产精品精品国产色婷婷| 欧美久久一二三四区| 蜜桃久久精品成人无码av| www.欧美日韩国产在线| 亚洲伊人色欲综合网| 精品国产免费一区二区三区四区| 日韩在线不卡av| 最新日本中文字幕| 精品一区二区av| 欧美亚洲动漫制服丝袜| 免费黄色片网站| 国产白丝网站精品污在线入口| 亚洲一二三区在线观看| 久久品道一品道久久精品| 91国模大尺度私拍在线视频| 中文字幕一区二区三区人妻| 成人免费毛片app| 天堂蜜桃一区二区三区| 亚洲国产岛国毛片在线| 欧美日本在线一区| www.xx日本| 中文字幕乱码一区| 国产99精品在线观看| 丝袜国产日韩另类美女| 国产精品嫩草影院com| 欧美一区二区精品在线| 艳母动漫在线看| 国产肥白大熟妇bbbb视频| 亚洲欧洲日韩综合一区二区| 91精品国产综合久久久蜜臀图片 | 欧美成人午夜电影| 日本福利一区二区|