You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

《Automate the Boring Stuff》Colorama心形网格打印着色异常排查

问题描述
  • 完成《Automate the Boring Stuff》教材的网格翻转打印挑战时,已掌握嵌套列表实现网格的逻辑,基础翻转功能可正常输出心形轮廓
  • 计划拓展功能:使用Colorama库将代表心形的O字符设置为红色,代表背景的.字符设置为绿色
  • 实际运行情况:心形轮廓可正常显示,彩色效果生效,但着色逻辑完全不符合预期
原实现代码
from colorama import Fore, init
init()

# 教材给定的原始网格,需要翻转后打印心形
grid = [['.', '.', '.', '.', '.', '.'],
        ['.', 'O', 'O', '.', '.', '.'],
        ['O', 'O', 'O', 'O', '.', '.'],
        ['O', 'O', 'O', 'O', 'O', '.'],
        ['.', 'O', 'O', 'O', 'O', 'O'],
        ['O', 'O', 'O', 'O', 'O', '.'],
        ['O', 'O', 'O', 'O', '.', '.'],
        ['.', 'O', 'O', '.', '.', '.'],
        ['.', '.', '.', '.', '.', '.']]


heart=[]

# 翻转网格存入新列表
for x in range(len(grid[1])):
      for i in range(len(grid)):
            heart.append(grid[i][x])

# 用于判断字符对应颜色
dot=['.']
circle=['O']

# 按每行9个字符打印,嵌套判断实现着色
for index, item in enumerate(heart):
      if ((index+1)%9==0):
            if item in dot:
                  print(Fore.GREEN+item)

            else:
                  print(Fore.RED+item)

      else :
            if item in dot:
                  print(Fore.GREEN+item, end=" ")


            else:
                  print(Fore.RED+item, end=" ")
问题根因
  • 最核心的bug:Colorama的Fore颜色设置是全局持久生效的状态,不是只绑定在你当前拼接的单个字符串上。你每次设置完颜色打印字符后从来没有重置过颜色状态,后面所有打印的内容都会沿用最后一次设置的颜色,自然会出现着色混乱的问题。
  • 无意义冗余:专门定义dot=['.']、circle=['O']两个单元素列表做成员判断完全多余,直接判断字符是否相等就行,平白增加没必要的代码。
  • 排版瑕疵:打印非行尾字符时额外加了空格,会把原网格的横向间距拉宽,让心形变形走样。
  • 逻辑绕路:本来直接按列遍历二维网格就能逐行打印,你非要先把网格拍平成一维列表,再靠索引取模判断什么时候换行,平白增加了逻辑复杂度,也容易出索引判断的bug。
修正参考代码
from colorama import Fore, init
# 初始化时开启自动重置,每次打印后自动恢复默认颜色,从根源避免颜色状态乱窜
init(autoreset=True)

grid = [['.', '.', '.', '.', '.', '.'],
        ['.', 'O', 'O', '.', '.', '.'],
        ['O', 'O', 'O', 'O', '.', '.'],
        ['O', 'O', 'O', 'O', 'O', '.'],
        ['.', 'O', 'O', 'O', 'O', 'O'],
        ['O', 'O', 'O', 'O', 'O', '.'],
        ['O', 'O', 'O', 'O', '.', '.'],
        ['.', 'O', 'O', '.', '.', '.'],
        ['.', '.', '.', '.', '.', '.']]

# 直接按列遍历打印,不需要拍平成一维列表再靠取模判断换行
for col in range(len(grid[0])):
    current_line = []
    for row in range(len(grid)):
        char = grid[row][col]
        if char == 'O':
            current_line.append(Fore.RED + char)
        else:
            current_line.append(Fore.GREEN + char)
    # 拼接整行后一次性打印,逻辑更简洁
    print(''.join(current_line))

内容的提问来源于stack exchange,提问作者dadagario

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 06:51:07