gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 07:40:41 25 4
gpt4 key购买 nike

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

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()的对象?

最佳答案

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

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

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

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

关于python - python内部函数定义中的变量是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22501923/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com