站長資訊網
        最全最豐富的資訊網站

        詳細分析之Python可變對象和不可變對象

        詳細分析之Python可變對象和不可變對象

        在 Python 中一切都可以看作為對象。每個對象都有各自的 id, type 和 value。

        1. id: 當一個對象被創建后,它的 id 就不會在改變,這里的 id 其實就是對象在內存中的地址,可以使用 id() 去查看對象在內存中地址。
        2. type: 和 id 一樣當對象唄創建之后,它的 type 也不能再被改變,type 決定了該對象所能夠支持的操作
        3. value: 對象的值

        一個對象可變與否就在于 value 值是否支持改變。

        相關學習推薦:python視頻教程

        不可變對象

        常見的不可變對象(immutable objects):

        1. Number: int, float, complex
        2. string
        3. tuple
        4. frozenset:set 的另外一種類型

        讓我們通過例子感受一下

        例子

        >>> x=1 >>> y=x >>> id(x)==id(y) True >>> id(1)==id(y) True

        這里創建了兩個 int 對象,并且讓 x,y 指向同一個對象,然后我們試著修改一下 x,讓 x+1

        >>>x=x+1

        這個時候 x 的 id 值和 y 的 id 以及 1 的 id 還一樣嗎?

        >>> x=x+1 >>> id(x)==id(y) False >>> id(x)==id(1) False >>> id(1)==id(y) True

        從結果不難看出來,x 所指向的對象已經改變了,但是 1 并沒有改變。這就是不可變對象,對于不可變對象來說,一旦創建之后就不允許被改變。

        注意: 不可變并不嚴格等同絕對的不可變

        >>> a=([1],2,3) >>> id(a) 4338862696 >>> id(a[0]) 4338949128 >>> a[0][0]=0 >>> id(a) 4338862696 >>> id(a[0]) 4338949128

        從上面的例子不難看出,我們改變了 a[0] 的值,但是并沒有影響它的 id 值。一個不可變容器對象如果包含對可變對象的引用,當后者的值改變時,前者的值也會改變;但是該容器仍屬于不可變對象,因為它的 id 值不會改變的。

        可變對象

        常見的可變對象(mutable objects):

        1. list
        2. dict
        3. set

        同樣的通過例子感受一下

        例子

        >>> c = [1,2,3] >>> b = c >>> id(b)==id(c) True

        創建兩個 list 對象,并且讓 c,d 指向同一個對象,然后我們試著修改一下 c

        c[0]=4

        這個時候在看一下兩個對象的 id 值是否一致

        >>> id(c)==id(b) True

        修改之后,c,d 仍然指向同一個對象,所以不難得出結論,對于一個可變對象來說,修改 value 值并不會對它的 id 造成任何影響

        函數參數

        對于可變對象和不可變對象,他們兩者在函數當作參數傳遞的時候表現也有所不同

        例子

        eg0

        def update_list(nums_list):   print(f'2 id:{id(nums_list)}')   nums_list += [10]   print(f'3 id:{id(nums_list)}')     number_list = [5, 6] print(f'1:{number_list}, id:{id(number_list)}')    update_list(number_list) print(f'4:{number_list}, id:{id(number_list)}')

        看一下結果

        1:[5, 6], id:4457707912
        2 id:4457707912
        3 id:4457707912
        4:[5, 6, 10], id:4457707912

        在看另外一個例子

        eg1

        def add_num(number):   print(f'2:{id(number)}')   number += 1   print(f'3:{id(number)}')   num = 1 print(f'1:{num}, id:{id(num)}')    add_num(num) print(f'4:{num}, id:{id(num)}')

        看一下結果

        1:1, id:4343768416
        2 id:4343768416
        3 id:4343768448
        4:1, id:4343768416

        有其他有些文章中,上面 eg0 被稱為引用傳遞,eg1 被稱為值傳遞。然而在官方文檔中,并沒有找到有關的這兩個名詞的任何內容,或者這種方式并不是上述的兩者任意一種。

        這里的重點是:對于可變對象,在函數中的值的改變,會導致對象改變;對于不可變對象,在函數中值的改變,對其不會造成任何影響

        贊(0)
        分享到: 更多 (0)
        網站地圖   滬ICP備18035694號-2    滬公網安備31011702889846號
        主站蜘蛛池模板: 蜜臀AV无码国产精品色午夜麻豆 | 久久精品国产影库免费看 | 国产精品666| 国产精品久久久久天天影视| 精品人妻少妇一区二区| 国产AV无码专区亚洲精品| 精品久久久久中文字幕一区| 久久99精品国产麻豆| 91精品无码久久久久久五月天| 亚洲精品成人无限看| 成人一区二区三区精品| 人妻少妇偷人精品无码| 999国产精品视频| 精品无码国产一区二区三区51安 | 精品无码人妻一区二区免费蜜桃 | 免费人妻精品一区二区三区| 四虎国产精品永久地址49| 99久久久精品免费观看国产| 亚洲2022国产成人精品无码区| 欧美久久亚洲精品| 精品多毛少妇人妻AV免费久久| 99亚洲精品视频| 久热这里只精品99re8久| 99免费精品视频| 99热门精品一区二区三区无码| 精品无码久久久久久尤物| 国产日韩欧美精品| 亚洲精品中文字幕乱码三区| 亚洲av无码成人精品区在线播放| 国产精品无码免费播放| 99久久国产主播综合精品 | 亚洲精品成人无限看| 四虎国产精品成人| 青草国产精品视频。| 欧美精品福利在线视频| 欧美精品色精品一区二区三区| 久久精品中文字幕一区| 久久丝袜精品中文字幕| 日本精品一区二区久久久| 久久久无码精品午夜| 欧美亚洲精品中文字幕乱码免费高清|