一、深浅拷贝
深浅拷贝是指copy模块下的copy()和deepcopy()方法。
1、浅拷贝
示例:
>>> import copy >>> a = 'hello word' >>> b = {1:'gome',2:'ahaii',3:[1,2,3,4]} >>> a1 = copy.copy(a) >>> b1 = copy.copy(b) >>> print id(a) 140458175739296 >>> print id(a1) 140458175739296 >>> print id(b) 140458175695680 >>> print id(b1) 140458175749208 >>> print id(b[3]) 140458175609096 >>> print id(b1[3]) 140458175609096 >>> print id(b[3][0]) 41361752 >>> print id(b1[3][0]) 41361752
浅拷贝时,变量的内存地址不会发生改变。
2、深拷贝
示例1:
>>> import copy >>> a = 'hello word' >>> print id(a) 140069292463520 >>> a1 = copy.deepcopy(a) >>> print id(a1) 140069292463520
对于字符串或者整型,深拷贝同浅拷贝效果一样,其内存地址不会发生改变。
示例2:
>>> import copy >>> b = {1:'hello word',2:'ahaii',3:[1,2,3,4]} >>> b1 = copy.deepcopy(b) >>> print id(b) 140442326100800 >>> print id(b1) 140442326156184 >>> print id(b[3]) 140442326014216 >>> print id(b1[3]) 140442326097288 >>> print id(b[3][0]) 32555352 >>> print id(b1[3][0]) 32555352
深拷贝时,除了最内层数据(字符串或数字)外,其他数据都会重新创建一份,内存地址发生改变。
二、函数之动态参数
示例1:
def func (*arg):#一个可变参数,放在元组中 print arg func (1,2,3,4,5,6)#结果为一个元组:(1,2,3,4,5,6)
*arg 表示该函数可以接受个数可变的参数,将获取的所有参数存放在一个元组中。
示例2:
def func (**kwargs):#一个可变参数,放在字典中 print kwargs func(a=123,b=234,c=345)#结果为一个字典:{'a': 123, 'c': 345, 'b': 234}
**kwargs 表示该函数可以接受个数可变的参数,将获取的所有参数以键值对形式存放在字典中。
示例3:
def func (*arg,**kwargs): print arg,kwargs l = [11,22,33] d = {'1':'ewe','2':'ddf'} func(l,d)#结果为一个元组和一个空字典:([11, 22, 33], {'1': 'ewe', '2': 'ddf'}) {}
该函数有两个形参,当给函数传参时(参数为一个元组和一个字典),函数会把这两个参数传给第一个形参*arg,生成一个元组。**kwargs没有接收参数,为一个空字典。
示例4:
def func(*arg,**kwargs):#两个可变参数,字符串放在元组中,键值对放在字典中 print arg,kwargs func('aha','dfjid','fdjfdkf',a=123,b=234)#结果为:('aha', 'dfjid', 'fdjfdkf') {'a': 123, 'b': 234}
既有字符串,也有键值对时,字符串传递给*arg,放在元组中,键值对传递给**kwargs,放在字典中。
示例5:
def func (*arg,**kwargs): print arg,kwargs l = [11,22,33] d = {'1':'ewe','2':'ddf'} func(*l,**d)#结果为:(11, 22, 33) {'1': 'ewe', '2': 'ddf'}