在循环时需要帮助理解这一点



在下面的代码段中,当缓冲区的长度达到 31 时,while 循环停止。但是对于每次迭代,我们都会添加 100,因此此循环应该只运行一次。

buffer=["A"]
counter=100
while len(buffer) <= 30:
buffer.append("A"*counter)
counter=counter+200

我错过了什么吗?

您要添加"AAAAAAAA..."每次,而不是 100 个单独的"A"。

以下几点应该可以回答您的问题。

  • 缓冲区是一个列表。
  • 循环的每次迭代都向 列表。
  • 每次迭代,您添加到列表中的元素都只是一个 更长的字符串。
  • len(buffer( 将返回列表中的项目数量。
  • 因为您只将一个元素(无论其长度如何(添加到 每次迭代的列表,只要列表 <= 30 个元素长(即 31 个元素(,它就会运行

这个循环继续运行的条件不是基于counter,而是基于列表buffer的长度。counter的值对迭代次数没有影响。

这是说:"当buffer的长度为 <= 30 时,继续运行以下块中的代码"。

缓冲区的长度每次迭代增加一个,因为我们只附加一个值。该值恰好是一个字符串,其中许多"A"相互连接。"A"s 的数量由counter的值决定,但我们仍然只添加一个字符串来buffer每次迭代。

buffer=["A"]
counter=100
while len(buffer) <= 30:
buffer.append("A"*counter)
counter=counter+200

while 检查列表长度的条件buffer。当string乘以标量时,它将该数量的字符串作为单个item返回。因此,每次检查条件时,都会添加一个具有不同长度的项目

例如,如果您尝试:

"hello"*2 

输出:

hellohello

这仍然代表列表中的单个项目

已经有多个正确答案,但我觉得它们未能为初学者提供足够清晰的关键区别。

buffer开始是["A"].你似乎有一种误解,认为["A"].append(["AAAAA"])会导致["AAAAAA"],而实际上它会导致["A", "AAAAA"]。随后对len(buffer)的评估将产生2,而不是6

相关内容

最新更新