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都是空的呢?奇怪?
python 函数里面 字典复制问题
答案:2 悬赏:50 手机版
解决时间 2021-03-15 11:36
- 提问者网友:欲望失宠
- 2021-03-15 08:39
最佳答案
- 五星知识达人网友:夜风逐马
- 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。。。
第一个,把你要传指针的东西放到列表里:
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}}
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯