模块化name_2_sex函数时触发NameError错误求助
解决NameError: free variable 'gender_list' referenced before assignment问题
这个错误的核心原因是:name_2_sex函数尝试访问的gender_list变量,在模块化后的函数作用域中未被定义。未模块化时它可能是全局变量,拆分到独立模块后,函数无法再直接访问这个外部变量。
以下是几种可行的修正方案:
方案1:将gender_list定义在函数内部
如果gender_list是固定的性别映射规则,直接把它初始化在函数内部,确保函数的独立性:
# 模块文件(比如gender_processor.py) import pandas as pd def name_2_sex(df): # 直接在函数内定义性别映射表 gender_list = { "张三": "男", "李四": "女", # 其他映射规则 } df['sex'] = df['name'].map(gender_list) return df
在test.py中调用:
import pandas as pd from gender_processor import name_2_sex test_df = pd.DataFrame({"name": ["张三", "李四"]}) result_df = name_2_sex(test_df)
方案2:将gender_list设为模块级变量
如果gender_list需要在模块内多个函数间复用,可以把它定义为模块级变量,函数内部直接引用:
# 模块文件(gender_processor.py) import pandas as pd # 模块级别的性别映射表 gender_list = { "张三": "男", "李四": "女", # 其他映射规则 } def name_2_sex(df): df['sex'] = df['name'].map(gender_list) return df
方案3:将gender_list作为函数参数传入
如果gender_list需要根据调用场景动态调整,把它作为参数传入函数:
# 模块文件(gender_processor.py) import pandas as pd def name_2_sex(df, gender_list): df['sex'] = df['name'].map(gender_list) return df
在test.py中调用:
import pandas as pd from gender_processor import name_2_sex # 自定义性别映射表 custom_gender_list = { "张三": "男", "李四": "女" } test_df = pd.DataFrame({"name": ["张三", "李四"]}) result_df = name_2_sex(test_df, custom_gender_list)
补充:如果gender_list来自外部文件
如果性别映射数据存储在外部文件(如CSV),可以在函数内部加载该文件,或者在模块初始化时加载:
# 模块文件(gender_processor.py) import pandas as pd def name_2_sex(df): # 从外部CSV加载性别映射表 gender_df = pd.read_csv("gender_mapping.csv") gender_list = dict(zip(gender_df["name"], gender_df["sex"])) df['sex'] = df['name'].map(gender_list) return df
内容的提问来源于stack exchange,提问作者Salvador
相关产品推荐
相关产品推荐

