Kaggle ML课程中Python函数为何能使用非参数非全局的外部变量
Kaggle ML习题函数运行逻辑说明
你遇到的这个函数能在Jupyter中正常运行的核心原因是Jupyter内核的变量作用域规则:
- 同一个Notebook内核的所有代码单元格共享同一个全局命名空间,只要你在调用
get_score函数之前,已经在其他单元格完成了X、y变量的赋值操作,这两个变量就会被存入全局作用域 - Python函数查找变量时会优先查找自身局部作用域,找不到的话会自动向上查找全局作用域的同名变量,所以不需要把
X、y作为参数传入也能正常调用
该写法的不合理之处
- 代码可读性差:没有显式声明函数依赖的数据源,第三方拿到代码无法快速明确函数运行需要的入参
- 复用性低:如果切换数据集或者变量名发生变动,函数会直接报错
- 存在隐式bug风险:如果全局作用域的
X、y后续被意外修改,函数的返回结果也会随之变动,很难定位问题
规范优化写法
建议将X、y作为显式参数传入函数,修改后代码如下:
def get_score(n_estimators, X, y): my_pipeline = Pipeline(steps=[ ('preprocessor', SimpleImputer()), ('model', RandomForestRegressor(n_estimators, random_state=0)) ]) scores = -1 * cross_val_score(my_pipeline, X, y, cv=3, scoring='neg_mean_absolute_error') return scores.mean()
调用时直接传入对应数据集即可,例如:get_score(n_estimators=100, X=train_x, y=train_y)
内容的提问来源于stack exchange,提问作者yyoavv
相关产品推荐
相关产品推荐

