Python代码报IndentationError缩进错误与未定义变量问题排查
问题根因
你遇到的IndentationError: unexpected indent报错确实由缩进错误导致,所谓“变量未定义”提示也是该缩进错误引发的连锁反应:
- 缩进错误位置在
min_variance函数段:写完bounds = tuple(bound for asset in range(num_assets))后,下一行的result = sco.minimize(...)没有添加函数层级缩进,被Python判定为函数外部代码,而再下一行的return result又保留了函数内缩进,缩进层级不匹配直接触发语法错误。 - 变量未定义的原因:
num_assets、args、bounds、constraints都是min_variance内部的局部变量,仅在函数作用域内可访问。由于result赋值语句被解析到函数外部,这行代码自然无法访问到上述局部变量,才会弹出未定义提示,并非你没有提前定义这些变量。
相关报错截图:
修复方法
- 调整
min_variance函数的缩进,将result赋值行和函数内其他代码保持4空格同级缩进,修复后代码如下:def min_variance(mean_returns, cov_matrix): num_assets = len(mean_returns) args = (mean_returns, cov_matrix) constraints = ({'type': 'eq', 'fun': lambda x: np.sum(x) - 1}) bound = (0.0,1.0) bounds = tuple(bound for asset in range(num_assets)) result = sco.minimize(portfolio_volatility, num_assets*[1./num_assets,], args=args, method='SLSQP', bounds=bounds, constraints=constraints) return result - 修复潜在的变量缺失问题:
random_portfolios函数中使用了len(stocks),但stocks既没有作为参数传入函数,也没有在函数内定义。如果stocks不是全局变量,运行到该行会触发NameError,建议直接替换为len(mean_returns),和其他函数的资产数计算逻辑保持一致,或者将stocks加入random_portfolios的参数列表。
内容的提问来源于stack exchange,提问作者Espejito
相关产品推荐
相关产品推荐

