對于Python語言中的變量賦值與復(fù)制,需要了解幾種基本類型的不同表現(xiàn)。
首先,對于數(shù)字類型、字符串類型等簡單的基本類型,賦值操作不涉及到內(nèi)存地址的操作,即兩個變量指向的相同的數(shù)據(jù)。
a = 10 b = a
上述代碼中,a和b兩個變量都指向數(shù)字10,任意一個變量修改該值,都將影響到另一個變量。
但是,對于List、Dict等可變類型而言,賦值操作實際上只是將兩個變量指向同一塊內(nèi)存地址,因此修改其中一個變量的值,另一個變量的值也會一起被改變。
a = [1, 2, 3] b = a b[0] = 0 print(a) # [0, 2, 3]
所以,這在某些情況下可能會導(dǎo)致很多問題,可以采用淺復(fù)制或深度復(fù)制來解決。
- 淺復(fù)制
- 深度復(fù)制
淺復(fù)制即將一個可變對象賦值給另一個變量,其中的元素的地址指向原來的可變對象,而不是復(fù)制一個新的對象。可以使用.copy()方法或者[:]進行復(fù)制。
a = [1, 2, 3] b = a.copy() b[0] = 0 print(a) # [1, 2, 3]
深度復(fù)制實際上是創(chuàng)建一個新的可變對象,在其中復(fù)制原來的對象,而不是復(fù)制原來對象的內(nèi)存地址。可以使用copy模塊中的deepcopy()函數(shù)。
import copy a = [1, 2, [3, 4]] b = copy.deepcopy(a) b[2][0] = 0 print(a) # [1, 2, [3, 4]]