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: 10impact 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...