永发信息网

python 函数里面 字典复制问题

答案:2  悬赏:50  手机版
解决时间 2021-03-15 11:36
  • 提问者网友:欲望失宠
  • 2021-03-15 08:39
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都是空的呢?奇怪?
最佳答案
  • 五星知识达人网友:夜风逐马
  • 2021-03-15 09:56
如果是我,我会在函数里面声明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楼网友:蓝房子
  • 2021-03-15 10:28
首先字典这种数据类型本来就是无序的,需要排序的话,当然只能是列表这种可以排序的数据结构。 当然,如果只是输出的话,那么没问题,你转成字符串好了,想如何显示就如何显示。 干脆给你打出来好了: from operator import itemgetter  a = {         'u1':{'i1':1,'i2':8,'i3':15,'i4':12},         'u2':{'i1':3,'i2':4,'i3':10,'i4':2},         'u3':{'i1':9,'i2':2,'i3':5,'i4':11},         'u4':{'i1':7,'i2':5,'i3':1,'i4':5}         } b = {} for u in a.keys():     b[u] = sorted(a[u].items(), key = itemgetter(1), reverse=false)[0:2] l=sorted(b.items(), key = itemgetter(0),reverse=false) s= '' print l for x in l:     d = {}     for y in x[1]:         d[y[0]] = y[1]     s += ',' + "'%s':%s" % (x[0],d) print '{%s}' % s[1:]结果:{'u1':{'i1': 1, 'i2': 8},'u2':{'i1': 3, 'i4': 2},'u3':{'i3': 5, 'i2': 2},'u4':{'i3': 1, 'i2': 5}}
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯