Pyhton 共享引用

2021-08-26 12:13:49 字數 1378 閱讀 7259

首先 

>>> a=3

>>> b=a

b=a會使python建立變數b。變數a正在使用,並且a這裡沒有被賦值,所以a被替換成其引用的物件3,從而b也成為這一物件的引用。a和b指向了相同的記憶體空間。這在python中叫做共享引用——多個變數名引用了同乙個物件。

下一步

>>> a=3

>>> b=a

>>> a='spam'

第三條語句建立了新的物件,並把a指向它。a的值發生了改變,b沒有改變。同樣如果只將b=spam,a也不會受到影響。

在python中,變數總是乙個指向物件的指標,而不是可改變的內在區域的標籤:給乙個變數賦乙個新值,並不是替換了原始的物件,而是讓這個變數去引用完全不同的乙個物件。實際的效果就是對乙個變數賦值,僅僅會影響那個被賦值的變數。

有一些物件和操作確實會在原處改變物件。例如,在乙個列表中對乙個偏移進行賦值確實會改變這個列表物件,而不是生成乙個新的列表物件。對於支援這種在原處修改的物件,乙個變數的修改會影響到其他的變數。

>>> l1=[2,3,4]

>>> l2=l1

>>> l1=24

>>> l1

24>>> l2

[2, 3, 4]

>>> l1=[2,3,4]

>>> l2=l1

>>> l1[0]=24

>>> l1

[24, 3, 4]

>>> l2

[24, 3, 4]

在這裡,沒有改變l1,卻改變了l1所引用物件的乙個元素。這類修改會覆蓋列表物件中的某部分。因為這個列表物件與其他物件共享的(被其他物件引用)。在這個例子中,也會對l2產生影響,因為它與l1都引用了相同的物件。

想避免這種情況可以使用拷貝。

分片:

>>> l1=[2,3,4]

>>> l2=l1[:]

>>> l1[0]=24

>>> l1

[24, 3, 4]

>>> l2

[2, 3, 4]

這裡對l1的修改不會影響l2,因為l2引用的是l1所引用的乙個拷貝,也就是說,兩個變數指向了不同的記憶體區域。注意這種分片技術不會應用在其他的可變的核心型別(字典和集合,因為它們不是序列)上,複製乙個字典或集合應該使用x.copy()方法呼叫。

python 共享引用

在上一節中,我給大家介紹了單個變數被賦值引用多個物件的情況。然而,單個 乙個 物件被多個變數引用又是怎麼一回事兒呢?a 3 b a 先上圖 圖1 吧,大家一看就一目了然了 變數名和物件,在執行賦值語句b a之後,變數a,b都指向了物件3的記憶體空間.假設這時執行 a python a將指向剛建立的字...

python共享引用

對於可變值 比如列表 當多個變數指向同乙個可變值時,它們就會共享同乙個引用 它們都指向同乙個值。通過其中乙個變數對值所作出的修改會影響到其他所有的變數,原因就是只有乙個共享的副本。mike khakis dress shirt jacket mr dawson mike honey mike hon...

Python共享引用和原處修改

在python中,變數總是乙個指向物件的指標,而不是可改變的記憶體區域的標籤 給乙個變數賦乙個新的值,並不是替換了原始物件,而是讓這個變數去引用完全不同的乙個物件。實際的效果就是對乙個不支援原處修改的變數賦值,僅僅會影響那個被賦值的變數。但對於支援在原處修改的物件,共享引用時需倍加小心,因為對乙個變...