python 函数里面 字典复制问题

In [39]: import copy

In [40]: def test(a_hash,b_hash):
....: b_hash = copy.deepcopy(a_hash)
....: print b_hash
....:

In [41]: a = {}

In [42]: b = {}

In [43]: a[1] = 1

In [44]: test(a,b)
{1: 1}

In [45]: b
Out[45]: {}

为什么b是空的啊?
我用b_hash = a_hash 或者 b_hash = a_hash.copy()
得到的b都是空的呢?奇怪?

如果是我,我会在函数里面声明b是global的,而不是用似是而非的传值传指针,你这样写是想说b_hash传递的是指针,可惜python里一旦用“=”赋值就已经相当于声明了一个新的变量,所以你的这个问题两种解决办法:

第一个,把你要传指针的东西放到列表里:

def test(aa,bb):
    bb[0]=copy.deepcopy(aa)
a={1:1}
b=[{}]
test(a,b)
print b[0]

这样保证你可以通过b这个名字找到改变后的指针。

第二个,在函数里声明你要修改的是全局变量:

def test(aa):
    global b
    b=copy.deepcopy(aa)
a={1:1}
b={}
test(a)
print b

当然,你还可以用既不是global也不是local的局部作用域,那可以说叫闭包,但有些不好懂就不说了。。。

 

楼上的方法思想和第一种一样,但是没做深层拷贝,一层for循环没有递归实现了copy.copy,而不是copy.deepcopy。。。

温馨提示:答案为网友推荐,仅供参考
第1个回答  2013-09-03

test函数中的b_hash是b的一个拷贝,用深拷贝操作等于是创建一个对象,让b_hash指向它,跟b没有关系;另外即便是浅拷贝,也是b_hash=a_hash,同样与b没有关系。一个的方法是让b_hash指向的对象发生变化,经实验,是可行的。

def test(a_hash,b_hash):
for key in a_hash:
b_hash[key]=a_hash[key]
print b_hash