91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Python中可變和不可變對象的詳細介紹

發布時間:2021-08-02 11:35:01 來源:億速云 閱讀:250 作者:chen 欄目:開發技術

這篇文章主要介紹“Python中可變和不可變對象的詳細介紹”,在日常操作中,相信很多人在Python中可變和不可變對象的詳細介紹問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Python中可變和不可變對象的詳細介紹”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

目錄
  • 前置知識

  • 有哪些可變對象,哪些不可變對象?

  • 不可變對象和可變對象的區別?

    • 不可變對象的應用場景

  • 從內存角度出發說下有什么區別?

    • 不可變對象

    • 可變對象

  • 從代碼角度看看區別

    • 不可變對象-整型

    • 不可變對象-字符串

    • 不可變對象-元組

    • 可變對象列表

  • Python 函數的參數傳遞

    • 概念

    • 參數傳遞不可變對象

    • 參數傳遞可變對象

  • 總結

    前置知識

    在 Python 中,一切皆為對象

    Python 中不存在值傳遞,一切傳遞的都是對象的引用,也可以認為是傳址 

    有哪些可變對象,哪些不可變對象?

    不可變對象:字符串、元組、數字(int、float)

    可變對象:數組、字典、集合 

    不可變對象和可變對象的區別?

    可變對象:改變對象內容,對象在內存中的地址不會被改變

    不可變對象:改變對象內容,對象在內存中的地址會被改變;如果必須存儲一個不同的值,則必須創建新的對象 

    不可變對象的應用場景

    它們在需要常量哈希值的地方起著重要作用,例如作為字典中的鍵

    從內存角度出發說下有什么區別?

    不可變對象

    Python中可變和不可變對象的詳細介紹

    Python 中的變量有一個內存空間

    具體的數據(對象)也有一個內存空間

    而變量保存(指向)的是存儲數據(對象)的內存地址,一般也叫對象引用

    不可變對象是指對象內容本身不可變

    變的是:改變了值,會創建新對象,然后變量改變了對象引用,指向了新對象,舊對象會被垃圾回收

    可變對象

    Python中可變和不可變對象的詳細介紹

    變的是:原來對象的內容,不會創建新對象,而變量也還是指向原對象

    從代碼角度看看區別

    不可變對象-整型

    a = 123
    b = a
    print(id(a))
    print(id(b))
    print(a, b)
    
    a += 2
    
    print(id(a))
    print(id(b))
    print(a, b)
    
    
    # 輸出結果
    4473956912
    4473956912
    123 123
    4473956976
    4473956912
    125 123

    從前兩次打印可以看到,a、b 變量保存的內存地址是同一個,他們們都保存了 123 的內存地址(123 對象的引用)

    預期情況:在 a 做了加法賦值運算之后,既然他們一開始都是指向同一個內存地址,按道理修改 123 后,他們也應該仍然指向同一個內存地址呀,但是并沒有!

    實際情況:a 指向了新的內存地址,而 b 仍然指向舊的內存地址,所以他們的值也不一樣 

    可以看看下面的圖

    首先,這是一個內存區域

    Python中可變和不可變對象的詳細介紹

    原理

    因為數字(int、float) 是不可變對象,所以不能在 123 的內存地址上直接修改數據

    加法賦值,實際上是將原來的 123 復制了一份到新的內存地址,然后再做加法,得到一個新的值 125,最后 a 再指向新的內存地址

    不可變對象-字符串

    a = "test"
    b = a
    print(id(a))
    print(id(b))
    print(a, b)
    
    a += "123"
    
    print(id(a))
    print(id(b))
    print(a, b)
    
    
    # 輸出結果
    4455345392
    4455345392
    test test
    4455818288
    4455345392
    test123 test

    不可變對象-元組

    a = (1, 2, 3)
    b = a
    print(id(a))
    print(id(b))
    print(a, b)
    
    a = a + a
    print(id(a))
    print(id(b))
    print(a, b)
    
    
    # 輸出結果
    4455410240
    4455410240
    (1, 2, 3) (1, 2, 3)
    4455359200
    4455410240
    (1, 2, 3, 1, 2, 3) (1, 2, 3)

    可變對象列表

    # 列表
    a = [1, 2, 3]
    b = a
    
    print(id(a))
    print(id(b))
    print(a, b)
    
    a += [4, 5, 6]
    
    print(a, b)
    print(id(a))
    print(id(b))
    
    
    # 輸出結果
    4327665856
    4327665856
    [1, 2, 3, 4, 5, 6] [1, 2, 3, 4, 5, 6]
    4327665856
    4327665856

    能看到 a 變量修改值之后,b 的值也隨之修改了

    可以看看下面的圖

    Python中可變和不可變對象的詳細介紹 

    因為 list 是不可變對象,所以并不會將原來的值復制到新的內存地址再改變,而是直接在原來的內存地址上修改數據
    因為 a、b 都是指向原來的內存地址的,所以 a、b 變量保存的內存地址是一致的(對象引用是一致的),當然值也是一樣的啦 

    Python 函數的參數傳遞

    這里先提前講下函數的入門,因為參數傳遞是個挺重要的點

    概念

    開頭有講到,Python 的一切傳遞都是對象的引用,函數參數傳遞也不例外

    當傳遞給函數的是一個變量,實際上傳遞的是變量保存的對象引用(變量指向的內存地址)

    在函數內部修改變量時,會根據變量指向的內存地址,去修改對應的值才對,事實真是如此嗎

    參數傳遞不可變對象

    # 函數
    def test_no_define(age, name):
        age = 123
        name = "poloyy"
        print(age, name)
    
    
    age = 1
    name = "yy"
    print(age, name)
    
    test_no_define(age, name)
    print(age, name)
    
    
    # 輸出結果
    1 yy
    123 poloyy
    1 yy

    參數傳遞可變對象

    # 函數
    def test_define(dicts, sets):
        dicts['age'] = 24
        sets.pop()
        print(dicts, sets)
    
    
    dicts = {"age": 123}
    sets = {1, 2}
    print(dicts, sets)
    
    test_define(dicts, sets)
    print(dicts, sets)
    
    
    # 輸出結果
    1 yy
    {'age': 123} {1, 2}
    {'age': 24} {2}
    {'age': 24} {2}

    總結

    當函數參數傳遞的變量是不可變對象的時候,函數內改變變量值,函數外的變量不會隨之改變

    當函數參數傳遞的變量是可變對象的時候,函數內改變變量值,函數外的變量會隨之改變

    到此,關于“Python中可變和不可變對象的詳細介紹”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!

    向AI問一下細節

    免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

    AI

    怀宁县| 天峻县| 辽阳市| 宜兰县| 西城区| 乌拉特前旗| 奈曼旗| 绥德县| 余干县| 阜康市| 社旗县| 马边| 铁岭县| 德阳市| 元氏县| 定陶县| 武定县| 饶河县| 平顶山市| 黄大仙区| 视频| SHOW| 昌吉市| 玛多县| 平凉市| 沙坪坝区| 工布江达县| 威宁| 渝北区| 怀远县| 周至县| 江油市| 藁城市| 罗山县| 宁蒗| 舞阳县| 瑞安市| 呈贡县| 铜山县| 丽江市| 五台县|