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

Python while循环仅执行一次即终止的问题排查求助

问题:Python while循环仅执行一次就终止

我是Python初学者,写了一段代码,想把文本里的每个字母循环遍历字母表(每次向前移一位),同时统计每次移位后字母'e'的出现次数。但现在while循环只跑一次就停了,找不到问题所在。

原代码

inp = (input("Paste in the encoded message (over 100 words):\n")).lower()
inp_list = list(inp)
letters = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z']
letter_counter = 26
new_list = []
number_of_es = []


def shift_list(lista):
    for item in lista:
        if item in letters:
            if (letters.index(item) - 1) < 0:
                position = (letters.index(item) - 1) + 26
            else:
                position = (letters.index(item) - 1)
            new_list.append(letters[position])
        else:
            new_list.append(item)
    return new_list

while letter_counter > 0:
    number_of_es.append(inp_list.count("e"))
    print(number_of_es)
    letter_counter -= 1
    inp_list = shift_list(inp_list)
    print(inp_list)
    print(letter_counter)

问题原因

核心问题出在全局变量new_list的累积效应:

  • new_list定义在函数外部,第一次调用shift_list时,它会被填充为移位后的字符列表;
  • 第二次调用shift_list时,new_list没有被清空,函数会在原有内容的基础上继续追加新的移位结果,导致inp_list的长度翻倍,后续循环的逻辑完全混乱,看起来像是只执行了一次(实际可能还在运行,但数据已经错误,或者因数据量过大卡住)。

修复方案

把new_list移到shift_list函数内部,每次调用函数时重新初始化,同时用模运算简化字母索引的计算:

inp = input("Paste in the encoded message (over 100 words):\n").lower()
inp_list = list(inp)
letters = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z']
letter_counter = 26
number_of_es = []


def shift_list(lista):
    new_list = []  # 移到函数内部,每次调用都创建新的空列表
    for item in lista:
        if item in letters:
            # 模运算自动处理循环移位,无需判断负数
            position = (letters.index(item) - 1) % 26
            new_list.append(letters[position])
        else:
            new_list.append(item)
    return new_list

while letter_counter > 0:
    number_of_es.append(inp_list.count("e"))
    print(number_of_es)
    letter_counter -= 1
    inp_list = shift_list(inp_list)
    print(inp_list)
    print(letter_counter)

修改说明

  1. 局部化new_list:将new_list放在函数内部,确保每次调用shift_list都是基于当前输入的列表生成全新的移位结果,不会累积之前的数据。
  2. 简化索引计算:用(index - 1) % 26替代原来的条件判断,模运算会自动处理负数情况(比如字母'a'的索引是0,0-1=-1,-1%26=25,正好对应字母'z'),代码更简洁高效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 04:51:12