我是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__
中是一个接一个的。我的问题是:在重复代码中,是否需要为archive
、id
、file
、files
、outfile
的变量命名?会不会有冲突或者什么的?有什么好的做法值得注意吗?在
通常,缩进块不会开始新的作用域。只有模块、类和函数定义新的作用域。(嗯,差不多了。在python3中,list/set/dict理解中的索引是本地的。)
例如,在您的示例中,
archive
位于出现with
语句的整个模块/类/函数的作用域内,以及首先在with
语句体中分配的任何变量。如果with
语句在模块范围内,那么所有的赋值都是模块全局变量。如果它位于类定义的顶层,那么它们都是类属性。如果它(很可能)是在函数或方法声明中定义的,那么它们对该函数是局部的。在假设这个代码在一个函数中,那么变量的作用域就是函数的末尾。如果此代码在模块级别,那么变量的范围就是模块(也称为全局)范围。在
你不能用不同的名字。以下代码只会在不同的时间将不同的对象分配给
archive
变量:相当于:
^{pr2}$也就是说,与
with
语句和循环相关联的块并没有定义变量的作用域,它们只是“仅仅”赋值。您应该看到为不同对象的id打印了两个不同的值。在请注意,由于示例代码使用
id
作为变量名,所以使用内置函数id
的示例应该小心使用!在冒着误入固执己见的危险:
相关问题 更多 >
编程相关推荐