Python变量在循环examp中的作用域

2024-04-25 21:50:59 发布

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

我是Python新手,对在循环中声明的变量的范围感到困惑。我见过一些例子,但在我的具体案例中我很难理解。在

例如,我看到以下代码段here

with ZipFile(self.archive_name, "r") as archive:
    for id, files in data.items():
        if files:
            print("Creating", id)
            dirpath = os.path.join(directory, id)

            os.mkdir(dirpath)

            for file in files:
                match = pattern.match(filename)
                new = match.group(2)
                new_filename = os.path.join(dirpath, new)

                content = archive.open(file).read()
            with open(new_filename, "wb") as outfile:
                outfile.write(content)

基本上,我让上面的代码以非常相同的方式重复,但在循环中执行了不同的语句。这些相似的代码段在我的__main__中是一个接一个的。我的问题是:在重复代码中,是否需要为archiveidfilefilesoutfile的变量命名?会不会有冲突或者什么的?有什么好的做法值得注意吗?在


Tags: inidnewforosas代码段match
2条回答

通常,缩进块不会开始新的作用域。只有模块、类和函数定义新的作用域。(嗯,差不多了。在python3中,list/set/dict理解中的索引是本地的。)

例如,在您的示例中,archive位于出现with语句的整个模块/类/函数的作用域内,以及首先在with语句体中分配的任何变量。如果with语句在模块范围内,那么所有的赋值都是模块全局变量。如果它位于类定义的顶层,那么它们都是类属性。如果它(很可能)是在函数或方法声明中定义的,那么它们对该函数是局部的。在

假设这个代码在一个函数中,那么变量的作用域就是函数的末尾。如果此代码在模块级别,那么变量的范围就是模块(也称为全局)范围。在

你不能用不同的名字。以下代码只会在不同的时间将不同的对象分配给archive变量:

with ZipFile(self.archive_name, "r") as archive:
    print(id(archive))

with ZipFile(self.archive_name, "r") as archive:
    print(id(archive))

相当于:

^{pr2}$

也就是说,与with语句和循环相关联的块并没有定义变量的作用域,它们只是“仅仅”赋值。您应该看到为不同对象的id打印了两个不同的值。在

请注意,由于示例代码使用id作为变量名,所以使用内置函数id的示例应该小心使用!在

Are there any good-practice concerns to keep in mind?

冒着误入固执己见的危险:

  • 很少在循环之外使用循环变量的值。因此,通常在函数后面的新循环中再次使用同一个循环变量是好的,但通常在再次使用该变量之前,您应该检查该变量名在函数中的所有使用情况。对于模块级代码,情况更糟:在添加第二个循环之前,您需要确保模块的任何外部用户都不依赖于具有第一个循环所剩值的变量。在
  • 除非对象在两个不同的地方充当相同的角色,否则尽管稍后在函数中重用变量是安全的,但仍然会有点混乱。在
  • 显然,在将代码复制粘贴两次到一个函数中之前,您需要合理地确定在您的特定情况下,重复(可能会有一些更改)确实比定义另一个函数并调用它两次要好。在

相关问题 更多 >