参考变量范围。
我正在试图找出这两者之间的区别。
例如,scheme函数中的匿名函数可以访问该函数的本地变量。 python有这个吗?
谢谢!
答案 0 :(得分:3)
在Python中,变量范围可以是全局的也可以是函数。在Scheme中,范围可以是任何块。
例如,在Scheme中,您可以在循环内定义变量,并且不能从循环外部访问它。在Python中,作用域是整个函数,这个变量会从循环中“泄漏”到函数的其余部分。
关于您的具体问题:请注意,Python中的匿名(lambda)函数非常有限(只有一个表达式,没有if / then语句,循环等),所以通常定义完整(命名)的内部函数。在这种情况下,范围规则类似于Scheme:内部函数可以访问外部函数的变量(创建闭包),而外部函数不能访问内部函数内定义的变量。
简而言之:词法范围和闭包按预期工作;请记住,作用域的粒度是按功能划分的,而不是每个块。
答案 1 :(得分:2)
微妙的问题。是的,Python lambdas关闭封闭函数中的变量。两种语言都有词汇范围。但细节却截然不同。
在Scheme中,您通常会引入一个带有(let)
或(letrec)
或(lambda)
的变量,并且它非常明确变量的范围。此外,只要变量在范围内,您就可以使用(set!)
分配给它。
在Python中,分配给名称隐式地创建一个局部变量,其范围是整个函数。因此,即使您可以按名称访问外部变量,如果您想将分配给外部作用域中的变量,您必须使用global
声明(或在Python 3.0中nonlocal
)。
Python也有类。类成员不是真正的词汇变量;方法不会关闭它们。
>>> def top(x):
... class C:
... x = 1 # foo does not close on this 'x'.
... def foo(self):
... return x # this refers to the argument of top
... return C().foo()
...
>>> top(2)
2
有关详细信息,请参阅Python语言参考:http://docs.python.org/reference/executionmodel.html#naming
答案 2 :(得分:0)
是的,Python能够在该函数中访问匿名函数的本地变量(在Python中,这称为lambda函数)。
我不完全确定这是否回答了您的问题,如果没有,请发布更多细节
答案 3 :(得分:0)
Scheme和Python都是词法范围的,就像你似乎要问的那样。
def make_adder(n):
when = datetime.now()
def adder(k):
print "The adder you created at %s has been called!" % when
return k + n
return adder