【发布时间】:2012-10-05 23:14:43
【问题描述】:
Python 手册将范围定义为:
范围定义名称在块中的可见性。如果一个本地 变量在块中定义,其范围包括该块。如果 定义发生在功能块中,范围扩展到任何块 包含在定义中,除非包含的块引入 名称的不同绑定。
我有这个程序:
import random
def f():
a = "Is the scope static?"
if random.randint(0, 1) == 1:
del a
print a
打印失败的概率为 50%:
>>> f()
Is the scope static?
>>> f()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 5, in f
UnboundLocalError: local variable 'a' referenced before assignment
由此,我认为 print 语句有 50% 的可能性超出了 'a' 的范围,但我可能是错的。 Python中范围的“正确”解释是什么? Python中变量的范围是静态定义的吗?变量“a”的作用域是什么?
【问题讨论】:
-
@Blender 该名称有 50% 的可能性不可见。
-
范围仅在存在的变量上定义。
del语句在运行时影响a,而不是在解释器解析脚本时。 -
@vz0 正如 Blender 所说,在定义时,a 的范围是函数 f 的本地范围。有 50% 的可能性它已被 del 语句显式地从命名空间中删除,但这不同于由于在其范围之外调用它而不可见。
-
@TimothyAWiseman 有什么不同?如果从命名空间中移除,则不在范围内。
-
@vz0 Ben 的回答解释说,这比我能想到的要好,但一种可能会有所帮助的思考方式是:如果在一个区域中定义了某些东西并且执行离开了该区域,那么它就超出了范围。在这里,您并没有离开它定义的区域,而是专门指示解释器将其从命名空间中删除。
标签: python