python - 我在 Python 中有一个包含 7 个元素的列表,但 len 运算符返回长度为 1
问题描述
Python 新手,这是我的第一个应用程序。我已经盯着这个看了一段时间,我确信我对正在发生的事情有一些基本的误解。
在这个例子中,我有一个包含 7 个 str(条目)的列表和一个赋值语句:
listLen = len(entries)
后面是断点,下面是显示调试器的屏幕截图,其中 listLen 被赋值为 1,条目是 {list: 7}
我希望 len(entries) 返回值 7,但我似乎无法获得预期的行为。我错过了什么?
更新:我认为答案是在 for 循环中修改列表,但显然不是。
如果我在分配条目之前设置断点并使用包括for 循环在内的调试器单步执行,那么一切看起来都很好并且可以正常工作。
如果我在 for 循环和单步上设置断点一次,条目再次显示为 {list: 7} 但 len(entries) 似乎为 1。 for 循环执行一个循环并退出。
我为调试制作的深拷贝entryCopy在其他任何地方都没有使用,并且被更改为[''],但我认为由于它没有被使用,它会被优化或垃圾收集,尽管它不会在从更早的单步执行时断点。
打破“for”循环并单步执行一次到“while”循环的开头后:
为什么单步执行代码可以正常工作,但在 for 循环中中断会导致 len(entries) 出错?
我仍在努力获得最少的可重现代码示例。
这是更多代码:
entries = self.userQuery.getEntries()
entriesCopy = copy.deepcopy(self.userQuery.getEntries())
entryList = list()
listLen = len(entries)
for ii in range(0,listLen):
while ("\n\n") in entries[ii]: entries[ii]=entries[ii].replace("\n\n","\n") #strip double newlines
while ("\t") in entries[ii]: entries[ii] = entries[ii].replace("\t", "") # strip tabs
entryList=entries[ii].split("\n")
while("" in entryList): entryList.remove('')
self.SCPIDictionary[self.instructions[ii][1].replace("\n","")]=entryList;
解决方案
在调试输出中看起来更高一点 - 你可以在第 42 行看到entries: ['']
我无法阅读你的 for 循环中的代码,所以我不知道发生了什么,但你似乎正在修改那里的列表。如果您使用“悬停”来查看该值,您将获得该变量的当前值。您在循环的“for”部分设置断点 - 尝试将其设置在循环的第一行和循环之前的行,并观察该条目列表是否发生突变。
--- 编辑 --- 您提供了更多代码。它……有点疯狂。为什么要在 while 循环中反复修改“条目”对象?然后将条目复制到另一个对象中,然后用刚刚复制的条目替换某个字典中的值(在矩阵字典上运行字符串转换后确定的键?)
两件事情-
为了调试这个,我关心类型。“getEntries”实际上是返回一个字符串列表,还是一个结果代理或类似的东西?例如,Sqlalchemy 实际上并不返回一个列表。python 调试器很棒,但是你在这里做了很多突变——相反,让我们使用 print 语句。
print(entries)
在每一行之后做。这将让您看到事情何时发生变化,以及至少您的循环执行了多少次。例如,如果它类似于结果代理,在您完成对其的迭代之后,当您在调试器中查看它时,其中可能没有任何东西。考虑一下 - 与其修改所有这些可变对象,不如提取值并修改它们。作为草稿——
for entry in entries:
values = []
for val in entry.replace("\n\n", "\n").replace("\t, "").split("\n"):
if val:
values.append(val)
self.CCPIDictionary[something?] = values
推荐阅读
- python - 如何在处理列表时使用 .pop 和 .append 进行 FIFO(而不是 LIFO)?
- sql-server - 没有公共字段的连接表
- java - 在 android studio 上的 SQLITE 中使用 Like 语句
- javascript - 使用cheerio访问特定的div
- r - R 在使用 cv.tree() 时遇到致命错误
- mysql - 无法插入 MySQL
- sql - 有没有办法将两个条件与 SSRS 颜色表达式结合起来?
- sql - SUMIF、分组依据、聚合依据
- php - 提交日期输入自动 1969 年 12 月 31 日,留空
- css - 有没有办法在构建 Visual Studio 项目时自动删除未使用的 CSS 规则?