Python帕斯卡三角生成器出错,请求问题排查
问题:Python帕斯卡三角生成器列表为空排查
我尝试用Python的嵌套列表和循环实现帕斯卡三角生成器,当n=2时,预期输出如下:
1 1 1 1 2 1
我的代码如下:
n = int(input("Enter the limit: ")) triangle = [] currentRow = 0 for currentRow in range(n+1): spaces = n - currentRow printables = currentRow - 1 temp = [] while spaces > 0: temp.append(" ") spaces -= 1 while printables > 0: if currentRow == 0: temp.append("1") triangle.append(temp) temp.clear() else: try: if (triangle[currentRow - 1][(spaces + 1) - 1]) == " " or (triangle[currentRow - 1][(spaces + 1) + 1]) == " ": temp.append("1 ") else: temp.append(f"{int(triangle[currentRow - 1][(spaces - 1) + 1]) + int(triangle[currentRow - 1][(spaces + 1) + 1])} ") triangle.append(temp) temp.clear() except IndexError: pass print(triangle)
但triangle列表始终输出为空,尽管我一直在向其中追加值,请求帮助排查问题。
问题排查与修复
核心问题分析
- 引用类型的陷阱:每次向
triangle追加temp后立刻调用temp.clear(),列表是引用类型,triangle里存的是temp的引用,清空temp会直接让triangle里的元素变成空列表。 - 循环条件逻辑错误:当
currentRow == 0时,printables = currentRow - 1 = -1,内层while printables > 0根本不会执行,导致第一行的1永远加不进triangle。 - 索引计算混乱:混合存储空格和数字的方式,让上一行元素的索引判断完全出错,再加上
try-except直接忽略IndexError,把大量逻辑错误都掩盖了。
修复后的代码
重构后的代码先生成纯数值的帕斯卡三角,再处理格式对齐,逻辑更清晰:
n = int(input("Enter the limit: ")) # 先生成纯数值的帕斯卡三角 triangle = [] for row_num in range(n + 1): row = [1] * (row_num + 1) # 计算中间元素 for j in range(1, row_num): row[j] = triangle[row_num - 1][j - 1] + triangle[row_num - 1][j] triangle.append(row) # 处理格式输出,添加前置空格对齐 for i, row in enumerate(triangle): spaces = n - i print(" " * spaces + " ".join(map(str, row))) # 查看最终生成的数值列表 print("\n生成的帕斯卡三角数值列表:") print(triangle)
修复说明
- 分离逻辑:先搞定纯数值的三角生成,这部分是帕斯卡三角的核心逻辑,验证起来更简单,再单独处理格式对齐的问题。
- 避免引用问题:每次生成全新的
row列表,直接追加到triangle,不会出现清空原列表导致的空值问题。 - 简化计算:利用帕斯卡三角的数学规律,每行首尾固定为1,中间元素等于上一行相邻两数之和,索引计算清晰不易出错。
内容的提问来源于stack exchange,提问作者Zey Roax
相关产品推荐
相关产品推荐

