python易誤點 賦值 深淺拷貝

2021-10-03 20:39:39 字數 1299 閱讀 2663

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淺...