Python和Scheme之间的变量范围有什么区别?

时间:2009-11-19 18:36:42

标签: python scheme

参考变量范围。

我正在试图找出这两者之间的区别。

例如,scheme函数中的匿名函数可以访问该函数的本地变量。 python有这个吗?

谢谢!

4 个答案:

答案 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