缩进不同的Python代码为何输出结果不同?
问题:缩进差异为何导致Python代码输出完全不同?
两段代码仅缩进不同,输出结果却明显有差异:
第一段输出:
array([[7.68717818e+11, 6.97681947e+11, 7.63307666e+11, 6.47349007e+11, 5.99065727e+11], [7.66709788e+11, 6.99939453e+11, 7.64013608e+11, 6.45261906e+11, 5.99177884e+11], [2.94202392e+11, 4.16042886e+12, 3.69055160e+11, 3.08724683e+11, 3.71083543e+11], ..., [2.32972294e+11, 2.25518151e+11, 2.16985500e+11, 1.52392619e+11, 1.87686750e+11], [1.31495500e+11, 4.03441481e+11, 1.66796570e+11, 7.37775506e+10, 1.55474795e+11], [1.26216951e+11, 5.60385882e+11, 1.49446146e+11, 7.23769941e+10, 1.45692856e+11]])
第二段输出:
array([[7.66709788e+11, 6.99939453e+11, 7.64013608e+11, 6.45261906e+11, 5.99177884e+11], [2.94202392e+11, 4.16042886e+12, 3.69055160e+11, 3.08724683e+11, 3.71083543e+11], [2.92378752e+11, 2.93673677e+12, 3.58775694e+11, 3.06625155e+11, 3.56276475e+11], ..., [1.31495500e+11, 4.03441481e+11, 1.66796570e+11, 7.37775506e+10, 1.55474795e+11], [1.26216951e+11, 5.60385882e+11, 1.49446146e+11, 7.23769941e+10, 1.45692856e+11], [0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00]])
两段代码如下:
第一段代码:
mses = np.zeros((len(all_models), 5)) kfold = KFold(5, random_state = 614, shuffle = True) j = 0 for train_index, test_index in kfold.split(cars_train): cars_tt = cars_train.iloc[train_index] cars_ho = cars_train.iloc[test_index] i = 0 for model in all_models: if model == "baseline": pred = np.power(10,cars_tt.log_sell.mean()*np.ones(len(cars_ho))) mses[i, j] = mean_squared_error(cars_ho.selling_price, pred) else: if len(model) == 1: reg = LinearRegression(copy_X = True) reg.fit(cars_tt[model].values.reshape(-1,1), cars_tt.log_sell.values) pred = np.power(10,reg.predict(cars_ho[model].values)) mses[i,j] = mean_squared_error(cars_ho.selling_price, pred) else: reg = LinearRegression(copy_X = True) reg.fit(cars_tt[model].values, cars_tt.log_sell.values) pred = np.power(10,reg.predict(cars_ho[model].values)) mses[i,j] = mean_squared_error(cars_ho.selling_price, pred) i = i + 1 j = j + 1 mses
第二段代码:
mses = np.zeros((len(all_models), 5)) kfold = KFold(5, random_state = 614, shuffle = True) j = 0 for train_index, test_index in kfold.split(cars_train): cars_tt = cars_train.iloc[train_index] cars_ho = cars_train.iloc[test_index] i = 0 for model in all_models: if model == "baseline": pred = np.power(10,cars_tt.log_sell.mean()*np.ones(len(cars_ho))) mses[i, j] = mean_squared_error(cars_ho.selling_price, pred) else: if len(model) == 1: reg = LinearRegression(copy_X = True) reg.fit(cars_tt[model].values.reshape(-1,1), cars_tt.log_sell.values) pred = np.power(10,reg.predict(cars_ho[model].values)) mses[i,j] = mean_squared_error(cars_ho.selling_price, pred) else: reg = LinearRegression(copy_X = True) reg.fit(cars_tt[model].values, cars_tt.log_sell.values) pred = np.power(10,reg.predict(cars_ho[model].values)) mses[i,j] = mean_squared_error(cars_ho.selling_price, pred) i = i + 1 j = j + 1 mses
分析与解答
1. 核心差异:i = i + 1的缩进位置
两段代码的唯一实质性区别是i = i + 1语句的缩进层级:
- 第一段代码中,
i = i + 1属于内层for循环的顶级代码块,不管当前model是不是"baseline",每次循环都会执行i的自增操作,保证每个模型对应mses的不同行索引。 - 第二段代码中,
i = i + 1被放到了else块的末尾,只有当model != "baseline"时才会执行i自增。
2. 输出差异的根源
当处理第一个模型(假设是"baseline")时:
- 第一段代码:写入
mses[0,j]后,i自增为1,后续模型依次写入mses[1,j]、mses[2,j]等,所有行都能被正确赋值。 - 第二段代码:写入
mses[0,j]后,i不会自增,后续模型都会覆盖mses[0,j]的值;同时,当kfold进入下一轮循环(j增加),i重置为0,再次处理"baseline"时依然写入mses[0,j],导致mses的第一行被多次覆盖,而最后几个模型的行因为i从未走到对应的索引,始终保留初始的0值,这就是第二段输出最后一行为全0的原因。
3. 这是Python的基础特性
这不是特殊情况,是Python的核心语法规则:用缩进划分代码块的归属,缩进不同意味着代码属于不同的逻辑块,执行的条件和时机完全不同。Python不像其他语言用大括号{}明确标记代码块,缩进就是代码块的边界,只要缩进层级变化,代码的执行逻辑就会改变,这是所有Python开发者必须遵守的基础规则。
内容的提问来源于stack exchange,提问作者user557
相关产品推荐
相关产品推荐

