Python中通过列表的循环的“Backlog”

2024-09-30 16:20:33 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个奇怪的Python初学者问题,。。在解释器中的虚拟环境中玩(python 3.5):

我有一个混合类型的列表:

lissi = ["foo", "bar". "boo", "baz", 4, 7]

然后“意外地”尝试打印出for循环中的所有元素,这些元素连接到一个字符串:

for x in lissi:
   print("Hallo " + x)

当然,这是不可能的。我们不能集中注意力。一个字符串的整数-所以第一个元素被打印出来,然后有一个TypeError

然后我只键入"x" and enter,看看是否还有数据存储,是的:x是4

type(x)int(试着弄清楚7是否仍然存在)

所以我的问题是:Python中for循环中的“幕后”会发生什么:似乎每个成功处理的元素都被删除了,但是有一个backlog存储在x中,它是TypeError抛出的第一个元素?如果出现错误,有没有办法从内存中“清除”这些数据

泰铢


Tags: 数据字符串元素类型列表forfoo虚拟环境
3条回答

我相信问题不在于for循环,而在于print()语句

不能用integer+一个string,例如:

这不起作用:

print("Hallo " + 4)

这也不会:

print(4 + " Hallo")

如果它都是整数,它将工作:

print(4 + 1)

print("Hallo " + 4)显示的错误是“builtins.TypeError: Can't convert 'int' object to str implicitly

解决方案是显式地将整数转换为字符串:

for x in lissi:
   print("Hallo " + str(x))

现在,对于你的问题,我不认为有什么东西是“后记”。for x in lissi的枚举仍然有效,x仍然有效,只是在处理前4个枚举(其中xstring)时,print()语句将工作,然后它在print()语句上抛出错误,但是x仍然是有效的integer

for循环是其声明范围的一部分,因此下面的代码将更改x的值:

x = 9

for x in xrange(3): # iterate 0, 1, 2
    print(x)

print(x) # x == 2, x != 9

当元素是"baz"时,一切正常,print语句工作正常。Python随后继续执行。下一步是x = 4。之后,print "Hallo" + x失败并出现错误

运行解释器时,捕获并打印错误,然后继续执行。解释器中出现错误后没有清理,因此检查值时,x的最后一个值仍然存在。这就是为什么你会看到4

它不是积压工作,也不像“每个成功处理的元素都会被删除”。
基本上,每次迭代for循环都会给变量x分配list lissi的下一个元素的值(不必是list,可以是任何iterable)。
每当循环由于异常或break语句而中断时,变量x保持不变,因此它包含由for循环分配的最后一个值。
这是可以的,因为循环在Python中没有任何独立的作用域,实际上可以方便地在iterable中搜索感兴趣的元素,在找到循环时会中断循环,并且在离开循环之前不会被迫将其存储在另一个变量中

相关问题 更多 >