【问题标题】:What's a variable in a inner function definition in python?python内部函数定义中的变量是什么?
【发布时间】:2014-04-25 11:10:15
【问题描述】:

view.generic.base中view的django中有类定义

class View(object):
    ...
    def as_view(cls, **initkwargs):
        """ 
        Main entry point for a request-response process.
        """
        ...

        def view(request, *args, **kwargs):
            self = cls(**initkwargs)
            if hasattr(self, 'get') and not hasattr(self, 'head'):
                self.head = self.get
            self.request = request
            self.args = args
            self.kwargs = kwargs
            return self.dispatch(request, *args, **kwargs)

        # take name and docstring from class
        update_wrapper(view, cls, updated=())

        # and possible attributes set by decorators
        # like csrf_exempt from dispatch
        update_wrapper(view, cls.dispatch, assigned=())
        return view

它应该返回一个类似 view(request, *args, **kwargs) 的函数。 请注意,'def view' 中有一个变量,即 'cls'。

假设我们运行:

tmp = View.as_view(),tmp(request, *args, **kwargs) 怎么知道cls的值是多少?


这是简化的情况!!!!!

这样说python代码:

>>> def func1(a):
...     def func2(b):
...         c = a + b
...         print c
...     return func2
... 
>>> func3 = func1(3)
>>> func3(1)
4
>>> func4 = func1(4)
>>> func3(1)
4
>>> func4(1)
5
>>> func3.a=5
>>> func3(1)
4
>>> func1.a=5
>>> func3(1)
4

func3的def中的'a'实际上是什么,func3是如何得到它的?


更新1:

感谢您的回答。问题没有完全表达出来。

我想,当我们调用func3 = func1(3)时,程序中有两个对象,func1的代码,被调用的func1(3)的对象(符号表)。

我的问题是:

  1. 是否存在调用代码func1()产生的func2()对象,或者func3的值只是一个指向产生的func1(3)成员的指针,即func2()的指令?

  2. 是func1(3)中调用func3(1)的a,还是func2()的对象?

【问题讨论】:

    标签: python django function class symbols


    【解决方案1】:

    您通过从另一个函数返回一个函数创建了一个closure

    使用您的简化示例,只要 func2 继续存在,范围内并从您的内部函数 func2 引用的任何变量都将保持在范围内。

    因此,即使在func1 结束后,func2 也始终可以访问在 func1 内声明的任何变量(包括 a 等函数参数)。

    func2 运行时a 的值将是您传递给func1 以生成func2 的特定实例的任何值

    【讨论】:

      【解决方案2】:

      首先,这里没有递归,我猜你的意思是内部函数定义。内部函数可以访问周围的范围(也称为闭包)。当您获得函数func3 的副本时,它将可以访问外部函数中定义的变量,包括调用它的参数

      【讨论】:

        【解决方案3】:

        让我解释一下你的代码是做什么的

        >>> def func1(a):
        ...     def func2(b):
        ...         c = a + b
        ...         print c
        ...     return func2
        ... 
        

        这将创建一个函数func1,它会返回另一个函数func2func2 是本地的 func1

        >>> func3 = func1(3)
        

        这将创建变量func3func3 的值是func2。因此,当您打印 func3 的值时,它将返回函数。

        >>> func3
        <function func2 at 0x7fd29fcb66e0>
        

        如果您尝试访问func3.a,那么它不会返回您1,因为a 不是func2 的属性。

        >>> func3.a
        Traceback (most recent call last):
          File "<stdin>", line 1, in <module>
        AttributeError: 'function' object has no attribute 'a'
        

        a 是局部变量,所以你不能访问它。当你调用func3 时,它会调用func2a 作为1

        >>> func3(1)
        4
        

        所以这将调用func2(1),其中a 是本地func2 中的3

        【讨论】:

          【解决方案4】:

          我已经运行了相同的 python 程序,但做了一些更改:

          >>> def func1(a):
          ...     def func2(b):
          ...             c = a + b
          ...             print c
          ...             print a
          ...             print b
          ...     return func2
          ... 
          >>> func3 = func1(3)
          >>> func3(1)
          4
          3
          1
          
          1. 首先当你调用 fun1(3) 时,然后 fun1 返回 fun2,类似这样

          def fun2(b):
              c = 3 + b
              print c
              print 3
              print b
          


          2. 现在,当您调用函数 func3(1) 时,实际上是在调用 func2(1)

          这是它应该工作的方式:)

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2019-05-23
            • 2021-08-20
            • 1970-01-01
            • 2018-07-31
            • 1970-01-01
            • 2023-03-26
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多