You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

UnboundLocalError报错:变量adj_parameter未赋值即被引用

解决UnboundLocalError: local variable 'adj_parameter' referenced before assignment

问题重现

执行Python代码的train_test函数时触发错误,报错信息如下:

UnboundLocalError: local variable 'adj_parameter' referenced before assignment

相关代码片段

train_test函数代码

def train_test(data_folder, view_list, num_class,
               lr_e_pretrain, lr_e, lr_c, 
               num_epoch_pretrain, num_epoch):
    test_inverval = 50
    num_view = len(view_list)
    dim_hvcdn = pow(num_class,num_view)
    data_tr_list, data_trte_list, trte_idx, labels_trte = prepare_trte_data(data_folder, view_list)
    labels_tr_tensor = torch.LongTensor(labels_trte[trte_idx["tr"]])
    onehot_labels_tr_tensor = one_hot_tensor(labels_tr_tensor, num_class)
    sample_weight_tr = cal_sample_weight(labels_trte[trte_idx["tr"]], num_class)
    sample_weight_tr = torch.FloatTensor(sample_weight_tr)
    if cuda:
        labels_tr_tensor = labels_tr_tensor.cuda()
        onehot_labels_tr_tensor = onehot_labels_tr_tensor.cuda()
        sample_weight_tr = sample_weight_tr.cuda()
    adj_tr_list, adj_te_list = gen_trte_adj_mat(data_tr_list, data_trte_list, trte_idx, adj_parameter)
...

调用train_test函数代码

if __name__ == "__main__":    
    data_folder = '../KIRP'
    view_list = [1,2,3]
    num_epoch_pretrain = 500
    num_epoch = 2500
    lr_e_pretrain = 1e-3
    lr_e = 5e-4
    lr_c = 1e-3
    
    if data_folder == 'KIRP':
        num_class = 4
    
    train_test(data_folder, view_list, num_class,
               lr_e_pretrain, lr_e, lr_c, 
               num_epoch_pretrain, num_epoch) 

错误原因

train_test函数内部调用gen_trte_adj_mat时,使用了变量adj_parameter,但该变量既没有作为参数传入train_test函数,也没有在函数内部提前定义赋值,导致Python解释器找不到该变量的有效定义,触发UnboundLocalError。

修复方案

根据adj_parameter的实际用途,选择以下两种修复方式之一:

方式1:将adj_parameter作为外部参数传入

如果adj_parameter是需要根据不同场景配置的外部参数,修改train_test的函数签名,添加该参数,并在调用时传入对应值:

  1. 修改train_test函数定义:
def train_test(data_folder, view_list, num_class,
               lr_e_pretrain, lr_e, lr_c, 
               num_epoch_pretrain, num_epoch, adj_parameter):
    # 原有函数逻辑保持不变
  1. 在主调用代码中定义并传入adj_parameter:
if __name__ == "__main__":    
    # 原有配置代码...
    adj_parameter = 0.5  # 根据实际业务需求设置合适的值
    train_test(data_folder, view_list, num_class,
               lr_e_pretrain, lr_e, lr_c, 
               num_epoch_pretrain, num_epoch, adj_parameter) 

方式2:在函数内部定义adj_parameter

如果adj_parameter是函数内部计算得到的变量,在调用gen_trte_adj_mat之前添加赋值逻辑:

def train_test(data_folder, view_list, num_class,
               lr_e_pretrain, lr_e, lr_c, 
               num_epoch_pretrain, num_epoch):
    # 原有函数逻辑...
    # 在调用gen_trte_adj_mat前添加adj_parameter的赋值
    adj_parameter = 0.5  # 可根据实际逻辑计算,比如基于数据维度、num_view等
    adj_tr_list, adj_te_list = gen_trte_adj_mat(data_tr_list, data_trte_list, trte_idx, adj_parameter)
    # 后续函数逻辑保持不变

注意事项

如果adj_parameter是全局变量,可在函数内部使用global adj_parameter声明,但这种方式会降低代码的可维护性,不推荐优先使用。

内容的提问来源于stack exchange,提问作者melolilili

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 11:31:00