首页 > 解决方案 > 我在 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;

标签: python

解决方案


在调试输出中看起来更高一点 - 你可以在第 42 行看到entries: ['']

我无法阅读你的 for 循环中的代码,所以我不知道发生了什么,但你似乎正在修改那里的列表。如果您使用“悬停”来查看该值,您将获得该变量的当前值。您在循环的“for”部分设置断点 - 尝试将其设置在循环的第一行和循环之前的行,并观察该条目列表是否发生突变。

--- 编辑 --- 您提供了更多代码。它……有点疯狂。为什么要在 while 循环中反复修改“条目”对象?然后将条目复制到另一个对象中,然后用刚刚复制的条目替换某个字典中的值(在矩阵字典上运行字符串转换后确定的键?)

两件事情-

  1. 为了调试这个,我关心类型。“getEntries”实际上是返回一个字符串列表,还是一个结果代理或类似的东西?例如,Sqlalchemy 实际上并不返回一个列表。python 调试器很棒,但是你在这里做了很多突变——相反,让我们使用 print 语句。print(entries)在每一行之后做。这将让您看到事情何时发生变化,以及至少您的循环执行了多少次。例如,如果它类似于结果代理,在您完成对其的迭代之后,当您在调试器中查看它时,其中可能没有任何东西。

  2. 考虑一下 - 与其修改所有这些可变对象,不如提取值并修改它们。作为草稿——

    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

推荐阅读