日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

Python学习之共享引用

發布時間:2025/3/15 python 13 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Python学习之共享引用 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Python 學習之共享引用

文章目錄

  • Python 學習之共享引用
    • 什么是共享引用
    • 共享引用和在原處修改(Shared References and In-Place Changes)
    • 共享引用和相等
    • 參考資料

什么是共享引用

假設我們在Python交互模式下輸入以下語句:

>>> a = 3 >>> b = a

實際的效果就是變量a和b都引用了相同的對象(指向了相同的內存空間)。這在Python中叫做共享引用——多個變量名引用了同一個對象。

如果再來一條語句

>>> a = 'spam'

會怎么樣?

變量a引用了由常量表達式‘spam’所創建的新對象,但是變量b仍然引用原始的對象3,因為這個賦值運算改變的不是對象3,它僅僅改變了變量a的指向,變量b并沒有發生改變。

在Python中,變量總是一個指向對象的指針,而不是可改變的內存區域的標簽(比如C語言中的變量)。給一個變量賦一個新值,并不是修改了原始的對象,而是讓這個變量去引用完全不同的一個對象。

注意:當可變的對象以及原處的改變進入這個場景,上述情形會有某種改變。

共享引用和在原處修改(Shared References and In-Place Changes)

有一些對象和操作確實會在原處改變對象。例如,在一個列表中通過偏移進行賦值,這確實會改變這個列表對象,而不是生成一個新的列表對象。對于支持這種在原處修改的對象,共享引用的時候一定要小心,因為對一個變量的修改會影響其他變量。

請看下面的語句:

>>> L1 = [2, 3, 4] >>> L2 = L1

L1 是一個包含了對象2、3、4的列表。列表中的元素是通過他們的位置進行讀取的,所以L1[0]引用對象2. 當然,列表自身也是對象,就像整數和字符串一樣。在運行了上面兩行語句后,L1和L2引用了相同的對象。

現在加上第3行:

>>> L1 = [2, 3, 4] >>> L2 = L1 >>> L1[0] = 24

我們看一下L1和L2的值:

>>> L1 [24, 3 ,4] >>> L2 [24, 3 ,4]

在這里,沒有改變L1,改變了L1所引用的對象的一個元素,這類修改會覆蓋列表對象中的某部分。因為這個列表對象同時被L1和L2引用,所以在原處修改不僅僅會影響L1,也會影響L2。雖然我們沒有改變L2,但是它的值將發生變化。

如果你不想要這樣的結果,那么需要拷貝對象,而不是創建引用。有很多拷貝列表的辦法,最簡單的辦法是從頭到尾的切片。

>>> L1 = [2, 3, 4] >>> L2 = L1[:] >>> L1[0] = 24 >>> L1 [24, 3, 4] >>> L2 [2, 3, 4]

這里,對L1的修改不會影響L2,因為L2引用的是L1所引用對象的一個拷貝。也就是說,L1和L2指向了不同的內存區域。

共享引用和相等

>>> x = 42 >>> x = 'shrubbery'

因為Python緩存并復用了小的整數和小的字符串,執行完這兩行代碼后,對象42也許不會被回收;相反地,它可能仍被保存在一個系統表中,等待下一次你的代碼生成另一個42來重復利用。盡管這樣,大多數種類的對象都會在不被引用的時候馬上回收。

在Python中有2種不同的方法去檢查兩個變量是否相等。

>>> L = [1, 2, 3] >>> M = L # M and L reference the same object >>> L == M # Same values True >>> L is M # Same objects True

==操作符測試兩個被引用的對象是否有相同的值,這種方法往往在Python中用作相等的檢查。

is操作符用來檢查對象的同一性。如果兩個變量名都指向同一個對象,則會返回 True,所以這是一種更嚴格的相等測試。

實際上,is只是比較實現引用的指針,所以這是一種檢測共享引用的方法。如果變量名指向不同的對象,就算這兩個對象的值相等,也會返回 False.

例如:

>>> L = [1, 2, 3] >>> M = [1, 2, 3] # M and L reference different objects >>> L == M # Same values True >>> L is M # Different objects False

如果對小的數字進行類似測試:

>>> X = 42 >>> Y = 42 # Should be two different objects >>> X == Y True >>> X is Y # Same object anyhow: caching at work! True

按理來說,第3~4行是可以理解的,因為兩個對象的值一樣;但是第5~6行就讓人匪夷所思了,X引用的42和Y引用的42本來是2個對象,應該輸出False才對,不過,因為小的整數和字符串被緩存并復用了,所以is告訴我們X和Y引用了同一個對象。

實際上,你可以用sys模塊中的getrefcount函數查詢對象的被引用次數。例如,我們查一下整數1被引用的次數:

>>> import sys >>> sys.getrefcount(1) 812

這種對象緩存和復用的機制與代碼是沒有關系的。Python這樣做是為了提高執行速度。

【End】




參考資料

《Python學習手冊(第4版)》,機械工業出版社

總結

以上是生活随笔為你收集整理的Python学习之共享引用的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。