关于Python值传递和引用传递的坑

在编写熵值法代码的时候,发现代码算出的结果和EXCEL手动计算的结果存在细微差异,排查了很久,终于发现问题

def Entropy (data):
    df3 = data
    df4 = data

    for index, row in data.iteritems():
        indexSum = data[index].sum()
        for i in range(0,len(row)): 
            if data[index][i] == 0:
                lnfij2 = 0.0
            else:           
                p2 = data[index][i] / indexSum
                #注:第一次熵值法0。00001可以不加,第二次必须要加;第一次到底加不加看后期模型效果
                lnfij2 = math.log(p2+ 0.00001) * p2 * (-k)
            df4[index][i] = p2
            df3[index][i] = lnfij2   
        
    # 计算冗余度
    E = df3
    d = 1 - E.sum(axis=0)
    return d, df4
    
d, p =  Entropy(df2)

在对df3和df4初始化的时候,目的是为了创建和data一样结果的dataframe,但这样仅仅只是引用传递,内存中并没有开辟新的空间,即df3、df4、data最终指向的是一个dataframe。如下:三个内存地址是一样的

    print('df3的内存地址:'+ str(id(df3)))
    print('df4的内存地址:'+ str(id(df4)))
    print('data的内存地址:'+ str(id(data)))

>>df3的内存地址:2596589110608
>>df4的内存地址:2596589110608
>>data的内存地址:2596589110608

正确代码写法应改为

def Entropy (data):
    df3 = pd.DataFrame(data = None, columns = data.columns, index = data.index)
    df4 = pd.DataFrame(data = None, columns = data.columns, index = data.index)

    for index, row in data.iteritems():
        indexSum = data[index].sum()
        for i in range(0,len(row)): 
            if data[index][i] == 0:
                lnfij2 = 0.0
            else:           
                p2 = data[index][i] / indexSum
                #注:第一次熵值法0。00001可以不加,第二次必须要加;第一次到底加不加看后期模型效果
                lnfij2 = math.log(p2+ 0.00001) * p2 * (-k)
            df4[index][i] = p2
            df3[index][i] = lnfij2   
        
    # 计算冗余度
    E = df3
    d = 1 - E.sum(axis=0)
    return d, df4
    
d, p =  Entropy(df2)

这样才是开辟了新的内存存放df3、df4

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值