赋值、深浅拷贝
赋值是将一个对象的地址赋值给一个变量,让变量指向该地址。
不可变元素:数字、字符串和元组,赋值、浅拷贝和深拷贝都指向同一地址。
可变元素:列表、字典。浅拷贝和深拷贝指向不同地址。
浅拷贝仅仅复制了容器中元素的地址。
浅拷贝是在另一块地址中创建一个新的变量或容器,但是容器内元素的地址均是源对象元素的地址拷贝。也就是说新的容器中指向了旧的元素( 新瓶装旧酒 )。
深拷贝,完全拷贝了一个副本,容器内部元素地址都不一样。
深拷贝是在另一块地址中创建一个新的变量或容器,同时容器内元素的地址也是新开辟的,仅仅是值相同而已,是完全的副本。
python中有一个模块copy,deepcopy函数用于深拷贝,copy函数用于浅拷贝。
所谓浅拷贝就是对引用的拷贝,所谓深拷贝就是对对象资源的拷贝。

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 """
数字 、字符串 和 元组,赋值、浅拷贝和深拷贝无意义,因为其永远指向同一个内存地址。
浅拷贝

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 """
filter,map,reduce
filter(function, iterable)
在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))