首页 > 技术文章 > Python之深浅拷贝&函数

ahaii 2016-01-18 18:37 原文

一、深浅拷贝

深浅拷贝是指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'}

 

推荐阅读