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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 19:39:03