str
='aaa'
str1=
strprint
(str
is str1)
str=
'bbb'
print
(str1)--
----
----
----
-output:
true
aaa
str=str1說明,str和str1指向同乙個位址,那麼為什麼str改變了值之後,str1沒有跟著變化呢?因為對於string這類的不可變物件,可變物件有list等,str=『bbb』實現開闢一塊位址給字串『bbb』然後將str指向這個位址。而str1還是指向之前儲存『aaa』的位址。這就導致了經過str=『bbb』後,str和str1指向了不同的位址。
那麼如何操作才能讓元素值相等但是不是指向同乙個位址呢?答案就是拷貝。
淺拷貝:shallow copy,只拷貝第一層的資料。python中賦值操作或copy模組的copy()就是淺拷貝
深拷貝:deep copy,遞迴拷貝所有層次的資料,python中copy模組的deepcopy()是深拷貝
淺拷貝
import copya=[
1,2,
3]aa=[
1,a,3]
aa1=copy.copy(aa)
aa1 is aa (
false
)aa[1]
is aa1[1]
(true
)
深拷貝
import copya=[
1,2,
3]aa=[
1,a,3]
aa1=copy.copy(aa)
aa1 is aa (
false
)aa[1]
is aa1[1]
(false
)
我們為要注意深拷貝和淺拷貝的區別呢:因為對於像列表這樣的資料結構,如果是淺拷貝,修改了兩個變數指向的同乙個處理相同位址的可變元素(比如list),就可能會導致沒能達到拷貝的效果。這裡需要注意。
例如:
import copya=[
1,2,
3]aa=[
1,a,3]
aa1=copy.copy(aa)
aa[1]=
[2,2
,2,2
]print
(aa[1]
)output:[2
,2,2
,2]
python賦值與深淺拷貝
參考文章 在python中,物件的賦值就是簡單的物件引用,這點和c 不同。如下 a 1 2,3 hello python c b a for i in range len a print id a i id b i all true print a b true這種情況下,b和a是一樣的,他們指向同...
Python賦值與深淺拷貝
a 1,2,3 b a a 4,5,6 賦新的值給 a a 4,5,6 b 1,2,3 a 的值改變後,b 並沒有隨著 a 變 a 1,2,3 b a a 0 a 1 a 2 4,5,6 改變原來 list 中的元素 a 4,5,6 b 4,5,6 a 的值改變後,b 隨著 a 變了 上面兩段 中,...
python 賦值 深淺拷貝的區別
在python中,物件賦值實際上是物件的引用。當建立乙個物件,然後把它賦給另乙個變數的時候,python並沒有拷貝這個物件,而只是拷貝了這個物件的引用 一般有三種方法,alist 1,2,3,a b 1 直接賦值,預設淺拷貝傳遞物件的引用而已,原始列表改變,被賦值的b也會做相同的改變 2 copy淺...