在下面的代码段中,当缓冲区的长度达到 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
。