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