Python运行报NameError: name 'product_id_list' is not defined 怎么解决
问题根因分析
这是典型的局部变量作用域+缩进错误问题,你认为缩进没有问题是误判:
- 在
make_dataSet_rowWise函数内部定义的product_id_list属于函数局部变量,仅在函数内部的缩进块范围内可访问 for prod_id in product_id_list:这行代码没有缩进,属于全局作用域代码,运行时函数还未调用,也无法访问函数内部的局部变量,因此会报未定义错误
其他附带错误
除了核心缩进问题外,你的代码还有多处语法和逻辑错误:
pd.Dataframe拼写错误,正确写法是pd.DataFrame(首字母F大写)- 后续的
for id in order_id_list、for order_prod in ordered_product_list、return语句全部缩进错误,都脱离了函数作用域 - 三个for循环的嵌套逻辑错误,第二层、第三层for循环没有缩进进上层循环内部,会导致仅执行最后一次遍历的结果
修正后的可用代码
import pandas as pd import numpy as np def make_dataSet_rowWise(reorder_product): print('unique Product in dataset = ', len(reorder_product.product_id.unique())) print('unique order_id in dataset = ', len(reorder_product.order_id.unique())) product_id_list = reorder_product.product_id.unique().tolist() product_id_list.append("order_id") product_id_dict = {} i = 0 # 第一层循环缩进进函数内部 for prod_id in product_id_list: product_id_dict[prod_id] = i i = i+1 product_id_df = pd.DataFrame(columns = product_id_list) row_list_all = [] order_id_list = reorder_product.order_id.unique() i = 1 # 第二层循环缩进进函数内部 for id in order_id_list: i = i+1 np_zeros = np.zeros(shape = [len(product_id_list)-1]) ordered_product_list = reorder_product.loc[reorder_product.order_id == id]["product_id"].tolist() # 第三层循环缩进进上层循环内部 for order_prod in ordered_product_list: np_zeros[product_id_dict.get(order_prod)] = 1 row_list = np_zeros.tolist() row_list.append(id) row_list_all.append(row_list) return (row_list_all, product_id_list) df_row_wise = make_dataSet_rowWise(reorder_product_99Pct) product_id_df = pd.DataFrame(df_row_wise[0], columns = df_row_wise[1]) product_id_df.head()
同类问题排查建议
- 遇到变量未定义错误首先检查变量定义的作用域:函数/类内部定义的局部变量默认无法在外部访问
- 仔细核对缩进层级:Python是强缩进语言,缩进层级直接决定代码所属作用域和执行逻辑,推荐统一用4个空格作为缩进单位,不要混用空格和制表符
- 报错指向某行变量未定义时,可以在报错行之前打印
locals()、globals()查看当前作用域内的有效变量,快速定位问题
内容的提问来源于stack exchange,提问作者juanguit
相关产品推荐
相关产品推荐

