python - 了解python内部函数。这是如何工作的?
问题描述
def prefix_factory(prefix):
def prefix_printer(text):
print(f"{prefix}: {text}")
return prefix_printer
现在让我们执行下面的行。
# First time we are executing this
debug = prefix_factory('DEBUG')
# Second time we are executing as
debug('Hello world')
我们第一次执行这个
第一次执行或将函数分配给变量 debug 被分配值“DEBUG”。我的理解是这就是它必须执行的方式。
理想情况下,内部函数 prefix_printer(text) - 在 prefix_factory() 中定义'return prefix_printer' 应该得到一个错误,说明文本不可用或文本丢失。
我们第二次执行为
debug('hello world') - 函数引用的第二次执行。第二次执行的问题是,我假设“hello world”应该被视为前缀的值。并且 text 应该是空白的,因为我们不会在 return 语句中使用任何值调用 prefix_printer。因此它必须是 '' 空字符串。我来自 c、C++ 背景。
我的问题是,它是第一次分配的同一段代码前缀,但在第二次执行调试期间('Hello world')它的行为不同。怎么可能,请详细说明这是如何工作的?
解决方案
执行时debug = prefix_factory('DEBUG')
,变量debug
被赋值为调用函数的返回值prefix_factory('DEBUG')
。如您所说,它没有分配值“DEBUG”。这个返回值是什么?
函数prefix_factory
返回prefix_printer
,它是一个嵌套在 中的函数prefix_factory
。此外,还prefix_printer
引用了一个prefix
在外部封闭函数中定义的变量 。当prefix_factory
返回一个嵌套函数时prefix_printer
,它引用嵌套函数中定义的变量,该返回的函数称为闭包。即使我们现在已经从对 的调用中返回,现在已经分配给变量printing_factory
的闭包函数仍然具有对变量值的引用,因为它在被调用时存在。prefix_printer
debug
prefix
prefix_factory
随后,当您执行时debug('Hello World')
,因为debug
计算结果为我们的prefix_printer
闭包,这相当于调用函数prefix_printer('Hello World')
,变量prefix
初始化为“DEBUG”。
推荐阅读
- ios - iOS上的Swift:全局队列上的任务将第二个任务添加到主队列以显示UIImageView,它不显示
- java - checkstyle插件在maven包上抛出major.minor 52错误,开发环境问题
- css - 用 css 和 vue 形成图形
- javascript - 如何在 react Native fetch 中创建自定义警报?
- c# - 如何获得总 GPU RAM(超过 4gb 内存)?
- snowflake-cloud-data-platform - 根据表 B 的拆分百分比雪花拆分表 A 的整数列
- php - 将带有名称和描述的 PHP 文本框发布到 HTML/Rest IIS 服务器
- c# - StreamWriter 和 BinaryWriter 在写入字符串时是否可以互换
- xml - 如何为多值 IMPORTXML 函数添加空白行?
- c++ - Nm 在共享库中显示符号,但链接时未定义符号