python中變數的儲存與拷貝

2021-09-11 19:35:43 字數 2881 閱讀 8847

python的所有變數都是引用型別,也就是說每個變數至少包括兩個部分:存放變數引用的記憶體塊和存放變數內容的記憶體塊

以字串為例

由於字串是不可變型別,如果改變已經建立字串的內容,將執行替換操作,將變數指向一塊新的記憶體。

s = 'abcd'

print(s,':',id(s))

s = 'ijmn'

print(s,':',id(s))

abcd : 1390779247728

ijmn : 1390779248120

現在可以回頭來看函式傳參的問題當我們傳遞乙個引數給函式時候,函式將會對傳入引數的位址建立乙個副本。

圓圈2為傳參時函式建立的傳入變數(圓圈1)的副本,他們擁有共同的指向(圓圈3)。那麼顯然在函式中,如果將副本重新指向一塊新的記憶體,傳入變數(圓圈1)的指向並不會改變,換句話說這種操作並不能影響函式外的變數。

因為改變不可變變數時,通常會使得副本重新指向新的記憶體塊,所以這種操作不會影響傳入變數。但是也有例外,比如tuple變數中包含list變數,在函式中對傳入的tuple變數中的list元素進行操作,將會影響傳入變數的值(這可以從上述方法中得到解釋)。

var = (10, [0, 0])

def func(var):

print('in function:', var)

func(var)

print('global:',var)

in function: (10, [0, 0, 1])

global: (10, [0, 0, 1])

順帶提一提類中的例項變數與類變數的操作問題

class a:

num = 10

lst = [0]

def f(self):

self.num = 100

self.t = 100

def f2(self):

a = a()

print('a.num:', a.num, 'a.num:', a.num)

a.f()

print('impact of f()')

print('a.num:', a.num, 'a.num:', a.num)

print('\n')

print('a.lst:', a.lst, 'a.lst:', a.lst)

a.f2()

print('impact of f2()')

print('a.lst:', a.lst, 'a.lst:', a.lst)

原則上講類變數應該用類名字引用,但是用例項引用(self.var)的方式引用也並不會報錯。程式結果如下:

a.num: 10 a.num: 10

impact of f()

a.num: 100 a.num: 10

a.lst: [0] a.lst: [0]

impact of f2()

a.lst: [0, 1] a.lst: [0, 1]

這說明用例項引用類變數的時候,實際上也是建立了乙個副本,走的就是函式傳參的那一套。

拷貝問題

主要有三個方式:

a = [1, 2, [0]]

b = a

b[0] = 100

print(a)

b的改變將影響a

a = [1, 2, [0]]

b = a.copy()#b = a[:]

b[0] = 'b'

print('a:', a)

print('b:', b)

a: [1, 2, [0]]

b: [『b』, 2, [0]]

a = [1, 2, [0]]

b = a.copy()#b = a[:]

b[2][0] = 'b'

print('a:', a)

print('b:', b)

a: [1, 2, [『b』]]

b: [1, 2, [『b』]]

可以看到,一層拷貝保證了第一層引用的改變不會相互影響,但是第二層改變是將影響被拷貝物件。

import copy

a = [1, 2, [0]]

b = copy.deepcopy(a)#b = a[:]

b[2][0] = 'b'

print('a:', a)

print('b:', b)

a: [1, 2, [0]]

b: [1, 2, [『b』]]

深拷貝是將原變數內容結構完全複製一遍到新的空間,兩者的記憶體指向已經完全不沾邊了,所以怎麼改變都不會相互影響。

Python中的拷貝與深淺拷貝

即為賦值.舉個例子 a 147147 b a 賦值 print a is b true 對於淺拷貝,字典 列表 元組等型別,它們只拷貝第一層位址 import copy n1 n3 copy.copy n1 淺拷貝 print id n1 print id n3 print id n1 k3 pri...

python 中的拷貝 淺拷貝與深拷貝

0.序列指什麼?序列型別是指容器內的元素從0開始的索引順序訪問,一次可以訪問乙個或者多個元素,包括字串 string 元組 tuple 列表 list the difference between tuple and list tuple would not be changed,but list ...

Python中的淺拷貝與深拷貝

1.淺拷貝 情況1的例項如下 import copy a 1,2 b 3,4 c a,b 注意這裡的c就是乙個可變物件!d copy.copy c print 變數c c print print 變數d d 結果 變數c 1,2 3,4 變數d 1,2 3,4 原因分析 需要拷貝的物件c是乙個lis...