什么';python内部函数定义中的变量是什么?

什么';python内部函数定义中的变量是什么?,python,django,function,class,symbols,Python,Django,Function,Class,Symbols,在view.generic.base中的视图的django中有类定义 class View(object): ... def as_view(cls, **initkwargs): """ Main entry point for a request-response process. """ ... def view(request, *args, **kwargs):

在view.generic.base中的视图的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
它应该返回类似于视图的函数(请求、*args、**kwargs)。 请注意,“def view”中有一个变量,即“cls”

假设我们运行:

tmp=View.as_View(),tmp(请求、*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的对象(符号表)被称为func1(3)

我的问题是:

  • 是否存在通过调用代码func1()生成的func2()对象,或者func3的值只是指向生成的func1(3)的成员的指针,该成员是func2()的指令

  • 是在func1(3)中调用func3(1)的a,还是func2()的对象

  • 您已通过从另一个函数返回函数来创建了

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

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

    当运行
    func2
    时,
    a
    的值将是传递给
    func1
    以生成通过从另一个函数返回函数而创建的
    func2

    的特定实例的值

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

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


    当运行
    func2
    时,
    a
    的值将是您传递给
    func1
    以生成
    func2
    的特定实例的值。对于start,这里没有递归,我想您指的是内部函数定义。内部函数可以访问周围的作用域(也称为闭包)。当您获得函数
    func3
    的副本时,它将有权访问外部函数中定义的变量,包括它在开始时被调用的参数,这里没有递归,我猜您指的是内部函数定义。内部函数可以访问周围的作用域(也称为闭包)。当您获得函数
    func3
    的副本时,它将可以访问外部函数中定义的变量,包括调用它的参数

    让我解释一下代码的作用

    >>> def func1(a):
    ...     def func2(b):
    ...         c = a + b
    ...         print c
    ...     return func2
    ... 
    
    这将创建一个函数
    func1
    ,返回另一个函数
    func2
    func2
    对于
    func1

    >>> func3 = func1(3)
    
    这将创建变量
    func3
    func3
    的值为
    func2
    。因此,当您打印
    func3
    的值时,它将返回函数

    >>> func3
    <function func2 at 0x7fd29fcb66e0>
    
    a
    是局部变量,因此您无法访问它。当您调用
    func3
    时,它将使用
    a
    作为
    1
    调用
    func2

    >>> func3(1)
    4
    

    因此,这将调用
    func2(1)
    ,其中
    a
    是本地
    func2
    中的
    3
    ,让我解释一下您的代码的作用

    >>> def func1(a):
    ...     def func2(b):
    ...         c = a + b
    ...         print c
    ...     return func2
    ... 
    
    >>> func3.a
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    AttributeError: 'function' object has no attribute 'a'
    
    这将创建一个函数
    func1
    ,返回另一个函数
    func2
    func2
    对于
    func1

    >>> func3 = func1(3)
    
    这将创建变量
    func3
    func3
    的值为
    func2
    。因此,当您打印
    func3
    的值时,它将返回函数

    >>> func3
    <function func2 at 0x7fd29fcb66e0>
    
    a
    是局部变量,因此您无法访问它。当您调用
    func3
    时,它将使用
    a
    作为
    1
    调用
    func2

    >>> func3(1)
    4
    

    因此,这将调用
    func2(1)
    ,其中
    a
    在本地
    func2
    中是
    3
    ,我运行了相同的python程序,但做了一些更改:

    >>> func3.a
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    AttributeError: 'function' object has no attribute 'a'
    
    >>> 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
    
  • 首先,当您调用fun1(3)时,fun1返回fun2,类似这样


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


    这就是它的工作方式:)

    我运行了相同的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
    
  • 首先,当您调用fun1(3)时,fun1返回fun2,类似这样


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

    这就是它的工作方式:)