我在程序(Python)中的函数内部定义了一个函数:
def func1:
x = 5
def func2(y):
return x*y
x = 4
print func2(5)
这里x的范围是如何工作的,没有重新定义x = 4的行的AND? 这是针对特定语言的行为吗?
答案 0 :(得分:0)
首先:你太懒了。在此处编写代码之前,至少要将其提供给解释器或编译器以获取相关语言,以清除明显的问题。在这种情况下,有两个:
()
。func1
来修复此问题
func2
在其调用位置未定义而无法运行。所以,试试吧
#!/usr/bin/env python
def func1():
x = 5
def func2(y):
#x = x + 1 # invalid: "x referenced before assignment"
return x*y # not invalid! reference to x is fine
global func3
func3 = func2
#print func3(5) # undefined
func1()
print func3(5)
#print func2(5) # undefined
评论三行;它们在取消注释时会产生错误。
正如您所看到的,默认情况下,变量和函数的Python定义都是 local :在函数中定义时,它们仅适用于该函数,不能在其他地方使用。
函数外部定义的变量可以在函数内部使用。
但是,它们只能读取,而不能写入。这解释了为什么我们可以在x
内使用func2
但无法分配给它;取消注释x = x + 1
时,会将其解释为应用于x
内的其他func2
变量,这就是为什么我们会收到错误,抱怨它未经初始化使用。
此外,Python还有 global 变量,可以在程序中的任何地方使用 ;此类变量必须明确标记为global
。
这非常类似于PHP(其中变量也可以标记为global
)并且与许多其他语言非常相似,例如C(没有global
,但是类似{{ 1}})。
您尝试让函数(extern
)使用在其定义的上下文中定义的变量(func2
),然后在{{1}的上下文之外调用该函数已定义并仍然有效。可以执行此操作的函数称为闭包。
我们刚看到Python only has partial support for closures:该函数可以读取这些变量,但不能修改它们。这已经比许多其他语言更好了。但是,完全关闭也可以修改这些变量。
例如,以下是有效的Perl代码:
x
完全关闭支持传统上与dynamic scoping相关联(即,在运行时评估可执行语句的定义)。这是因为它是由Lisp引入的,它是动态范围的,并且在使用static (lexical) scoping的语言中很少支持它(其中定义的范围是在编译时确定的,而不是在运行时确定的)。但是这个Perl代码中的所有变量和函数定义都是静态范围的。