Python函数r2d2多次调用后数组输出不符合预期的问题咨询
问题原因与解决方案
问题出在Python的短路求值特性上。
看r2d2里的核心代码:b = b and bb8(a,k),当b变成False之后,and右侧的bb8(a,k)不会再执行——因为False和任何值做and结果都是False,Python会直接跳过右侧表达式的计算以节省性能,但这就导致后续数组元素没有被调用bb8执行减1操作。
第二次调用r2d2(a)时的具体流程:
- 初始
b=True,处理k=0:调用bb8(a,0),a[0]变为-1,返回False,此时b更新为False - 后续k=1、2、3时,因为
b已经是False,b and bb8(...)直接返回False,完全跳过bb8的执行,所以a[1]、a[2]、a[3]保持原来的1、2、3不变,最终数组就是[-1,1,2,3]
解决方案
要让所有数组元素都执行bb8的减1操作,不管前面的判断结果如何,需要把「执行操作」和「逻辑判断」分开,避免短路求值。推荐两种修改方式:
方式一:先收集所有操作结果再判断
def r2d2(a): all_results = [] for k in range(len(a)): # 先强制执行bb8,把结果存入列表 res = bb8(a,k) all_results.append(res) # 最后统一判断所有结果是否为True return all(all_results)
方式二:先执行操作再更新判断变量
def r2d2(a): b = True for k in range(len(a)): # 先执行bb8得到结果,再更新b res = bb8(a,k) b = b and res return b
两种修改后,第二次调用r2d2(a)时所有元素都会被减1,最终数组会变成[-1,0,1,2],符合预期。
内容的提问来源于stack exchange,提问作者Ezel Bayraktar
相关产品推荐
相关产品推荐

