python字典操作的问题

yaphone 发布于 2015/05/06 19:55
阅读 239
收藏 0

python字典操作的问题。

代码如下:

def com_weight(dic1,dic2):
    dic3 = dic1
    for i in dic1.keys():
        for j in dic1[i].keys():
            dic3[i][j]=dic1[i][j]-dic2[i][j]
        
    print dic3


if __name__=='__main__':
   
    dic1 = {1: {1: 142264, 2: 142315}, 2: {3: 142111}, 3: {3: 142723}}
    dic2 = {1: {1: 142263, 2: 142312}, 2: {3: 142110}, 3: {3: 142722}}       
        
    print '__________________'
    print dic1
    print dic2
    print '*******************'
    com_weight(dic1, dic2)
    print '~~~~~~~~~~~~~~~~~~~~~~~~'
    print dic1
    print dic2

运行结果为:

__________________
{1: {1: 142264, 2: 142315}, 2: {3: 142111}, 3: {3: 142723}}
{1: {1: 142263, 2: 142312}, 2: {3: 142110}, 3: {3: 142722}}
*******************
{1: {1: 1, 2: 3}, 2: {3: 1}, 3: {3: 1}}
~~~~~~~~~~~~~~~~~~~~~~~~
{1: {1: 1, 2: 3}, 2: {3: 1}, 3: {3: 1}}
{1: {1: 142263, 2: 142312}, 2: {3: 142110}, 3: {3: 142722}}


我想请教一下大家,为什么我再调用了com_weight函数后,dic1的字典内容就改变了呢?

        

加载中
0
excepiton
excepiton

dict3 = dict1

后面循环里对dict3的赋值操作都是在对dict1指向的字典进行操作

y
yaphone
谢谢,意思是dic3和dic1指向的地址其实是相同的对吗? 那如果我想实现我的这个功能,就本题来说,dic3=dic2-dic1,程序应该怎么改写呢,再次感谢!
0
y
yaphone

谢谢,意思是dic3和dic1指向的地址其实是相同的对吗?

那如果我想实现我的这个功能,就本题来说,dic3=dic2-dic1,程序应该怎么改写呢,再次感谢!


0
y
yaphone
明白了,用深拷贝,我把代码改了下,可以了,谢谢各位朋友了!
0
MeiKai
MeiKai
字典是引用类型,如果实现字典加减,可以重写字典类,python有提供运算符重载
0
小毛驴VS
小毛驴VS
你这里是做的浅拷贝,用深拷贝就不会变了
0
KayChen
KayChen

学习了,直接赋值其实只是引用对象。

import copy
a = [1, 2, 3, 4, ['a', 'b']]# 原始对象
b = a                       # 赋值,传对象的引用,完全相等改变
print a is b #True
print a == b #True

c = copy.copy(a)            # 对象拷贝 浅拷贝,子对象的值跟着变,父对象值不变
d = list(a)
e = a[:]
print a is c #False
print a == c #True

f = copy.deepcopy(a)        # 对象拷贝,深拷贝,两个对象完全没关系
print a is f #False
print a == f #True

a.append(5)                 # 修改父对象a
a[4].append('c')            # 修改对象a中的子对象['a', 'b']

print 'a = ', a             # a = [1, 2, 3, 4, ['a', 'b', 'c'], 5]
print 'b = ', b             # b = [1, 2, 3, 4, ['a', 'b', 'c'], 5]
print 'c = ', c             # c = [1, 2, 3, 4, ['a', 'b', 'c']] 
print 'd = ', d             # d = [1, 2, 3, 4, ['a', 'b', 'c']]
print 'e = ', e             # e = [1, 2, 3, 4, ['a', 'b', 'c']]
print 'f = ', f             # f = [1, 2, 3, 4, ['a', 'b']]



0
开源中国首席男科主任
开源中国首席男科主任
好吧,我是被标题的那个操字吸引进来的
返回顶部
顶部