for循环内的变量作用域(imaplib库文档)

时间:2019-07-26 13:10:38

标签: python python-3.x imaplib

import getpass, imaplib

M = imaplib.IMAP4()
M.login(getpass.getuser(), getpass.getpass())
M.select()
typ, data = M.search(None, 'ALL')
for num in data[0].split():
    typ, data = M.fetch(num, '(RFC822)')
    print('Message %s\n%s\n' % (num, data[0][1]))
M.close()
M.logout()

该代码从文档here中提取(滚动到页面底部)。我认为for循环内的数据分配将覆盖for循环开始之前所做的数据分配。由于python中的作用域是最接近的函数,类或模块;数据变量赋值将覆盖原始赋值。

因此,for循环使用的数据实际上是第一次运行时在for循环内设置的数据。这是代码中的错误吗?应该将内部变量重命名为data1吗?

2 个答案:

答案 0 :(得分:1)

我认为可以,但是可能不够可读,或者您可以将其重命名为data1

问题在于data[0].split()返回一个新对象,并且for循环在这里使用该匿名对象,该匿名对象不会被内部分配覆盖。

答案 1 :(得分:0)

这似乎不是错误。看起来他们只是在初始化变量,然后在for循环的第一个循环上对其进行更新。您说对了,for循环使用的数据是循环内的一组数据,这是正确的。