賦值是將一個對象的地址賦值給一個變量,讓變量指向該地址。python
不可變元素:數字、字符串和元組,賦值、淺拷貝和深拷貝都指向同一地址。app
可變元素:列表、字典。淺拷貝和深拷貝指向不一樣地址。ide
淺拷貝僅僅複製了容器中元素的地址。函數
淺拷貝是在另外一塊地址中建立一個新的變量或容器,可是容器內元素的地址均是源對象元素的地址拷貝。也就是說新的容器中指向了舊的元素( 新瓶裝舊酒 )。spa
深拷貝,徹底拷貝了一個副本,容器內部元素地址都不同。3d
深拷貝是在另外一塊地址中建立一個新的變量或容器,同時容器內元素的地址也是新開闢的,僅僅是值相同而已,是徹底的副本。指針
python中有一個模塊copy,deepcopy函數用於深拷貝,copy函數用於淺拷貝。code
所謂淺拷貝就是對引用的拷貝,所謂深拷貝就是對對象資源的拷貝。對象
import copy n1 = 23 # 數字 n2 = "abc" # 字符串 n3 = ("we", "he", "she") # 元組 print(id(n1), id(n2), id(n3)) n4 = n1 n5 = n2 n6 = n3 print(id(n4), id(n5), id(n6)) n7 = copy.copy(n1) n8 = copy.deepcopy(n2) n9 = copy.deepcopy(n3) print(id(n7), id(n8), id(n9)) """ 1501832560 6521888 12307768 1501832560 6521888 12307768 1501832560 6521888 12307768 """
數字 、字符串 和 元組,賦值、淺拷貝和深拷貝無心義,由於其永遠指向同一個內存地址。blog
淺拷貝
import copy n1 = {"k1": "wu", "k2": 123, "k3": ["alex", 456]} n2 = ("we", "he", "she") n3 = [22,33,44] print(id(n1),id(n2),id(n3)) n7 = copy.copy(n1) n8 = copy.copy(n2) n9 = copy.copy(n3) print(id(n7),id(n8),id(n9)) """ (41310656, 8044176, 41293624) (41311808, 8044176, 41315424) """
深拷貝
import copy n1 = {"k1": "wu", "k2": 123, "k3": ["alex", 456]} n2 = ("we", "he", "she") n3 = [22,33,44] print(id(n1),id(n2),id(n3)) m7 = copy.deepcopy(n1) m8 = copy.deepcopy(n2) m9 = copy.deepcopy(n3) print(id(m7),id(m8),id(m9)) """ (40131008, 7061136, 40113976) (40132304, 7061136, 40133416) """
函數形參是指針,指向實際參數的。
修改或刪除形參的值 ,實際參數值也變化。
def func(args): print(type(args)) args.append(123) print(args) li = [1, 2] func(li) print(li) """ <type 'list'> [1, 2, 123] [1, 2, 123] """
def func(args): del args[2:] li = [1,2,3,4] a = func(li) print(li) #[1, 2]
形式參數 賦值 另開闢內存
def func(args): args=123 li = [1,2,3,4] a = func(li) print(li) #[1, 2, 3, 4]
lambda 匿名函數
def f1(ar1, ar2): return ar1 + ar2 ret = f1(3, 4) print(ret) f2 = lambda ar3, ar4: ar3 + ar4 ret = f2(3, 4) print(ret) """ 7 7 """
在function不爲None的狀況下,
filter(function, iterable) 等同於 [item for item in iterable if function(item)]; 不然等同於 [item foritem in iterable if item](function爲None)。
def f1(x): if x > 22: return True else: return False ret = filter(f1, [11, 22, 33, 44, 55, 66]) # 默認處理結果返回是一個類,須要迭代打印,由於浪費內存。 能夠用next迭代取值。 或者for循環 循環依次取出 print(next(ret)) print(next(ret)) print(list(ret)) """ 33 44 [55, 66] """
filter中 lambda 函數替換 函數f1
ret1 = filter(lambda x:x>22,[11,22,33,44])
print(list(ret1))