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的函数签名,添加该参数,并在调用时传入对应值:
- 修改
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): # 原有函数逻辑保持不变
- 在主调用代码中定义并传入
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
相关产品推荐
相关产品推荐

