python 引用與拷貝

2021-06-16 13:57:58 字數 1625 閱讀 6168

第一:變數與物件

型別屬於物件,而不屬於變數。變數相當於c++中的void*,可以指向任何物件。

a = 3  #建立int物件3,變數a指向物件3

a = "test"  #建立string物件,變數a指向物件"test"

第二:引數傳遞

python中引數傳遞,相當於傳遞變數值,注意:傳遞的是變數的值,而不是物件的值。

def func(val):

val = 4

a = 3

func(a)

print a

輸出3

func(a)將變數a的值傳遞給val,相當於變數a與val同時指向物件3。val=4,建立新

物件4,讓val變數指向物件4。此過程並沒有改變物件3,也沒有改變變數a的指向。

def func(val):

val = 3

a = [1,2,3]

func(a)

print a

輸出[1,2,3],原理同上。

def func(val):

val[0] = 0

a = [1,2,3]

func(a)

print a

輸出[0,2,3]

同樣func(a)將a的值傳給了val,變數a與val同時指向列表[1,2,3]。

由於列表物件可以更改,所以列表第乙個元素的指向變成物件0。

第三:淺拷貝與深拷貝

a = ["abc", [1,2]]

b = a[:]

c = list(a)

a[0] = 2

print a

print b

print c

輸出:

[2, [1, 2]]

['abc', [1, 2]]

['abc', [1, 2]]

a = ["abc", [1,2]]

b = a[:]

c = list(a)

a[1][0] = 2

print a

print b

print c

輸出:

['abc', [2, 2]]

['abc', [2, 2]]

['abc', [2, 2]]

我認為可以這樣理解:列表中其實存放的是乙個個引用,相當於a中存放了兩個引用,

乙個指向字串物件"abc",乙個指向列表物件[1,2]。

[:]與list僅僅進行了淺拷貝,即列表是新的,但是它內部的引用是舊的。可以這樣說有三個列表,內部引用值一樣,都指向了字串物件"abc"和列表物件[1,2]。

當a[0] = 2時,a指向的列表的第乙個引用指向新建的int物件2,而b,c物件不受干擾,仍然指向物件「abc」

當a[1][0]=2時,a[1]該列表的第二個引用,它指向了另乙個列表假設為x,x的第乙個引用x[0]指向了新int物件2。這樣,三個列表的第二個引用值都沒有發生改變,

都指向了x列表,而x列表發生了改變,所以,三者共同發生改變。

python的引用 淺拷貝與深拷貝

引用 a a n 100 b ac b b 0 b 此時a 0 b c 0 b 淺拷貝 完全切片 list dict等 a a n 100 b list a c list b b 0 b c 0 c b 1 1 30 此時a 1 1 30 c 1 1 30 為什麼b 0 a 0 c 0 因為它是字串...

Python 引用指向 淺拷貝與深拷貝

又稱賦值,即 就是建立了物件的乙個新的引用,修改其中任意乙個變數都會影響到另乙個。引用指向的耦合度100 a b id a id b 淺拷貝 就是建立乙個新的物件,但它包含的是對原始物件中包含項的引用 淺拷貝的耦合度是0 100之間 import copy a 11,22 b 33,44 c a,b...

python 引用,淺拷貝,深拷貝

引用 當物件是不可變型別的時候,int float double string tuple 純tuple 遇到 引用 問題時,雖然起初兩個變數指向同乙個記憶體位址,但是改變了其中乙個值,並不會影響另外乙個 會重新開闢記憶體位址 當物件是可變型別的時候,list dic,遇到 引用 問題,會一直共享一...