python - 我可以根据它在内存中的地址或它的 id 调用一个 lambda 函数吗?
问题描述
我正在学习 Python 中的 lambda 函数。
如果我编写了一个 lambda 表达式行而不将其分配给某个函数名称,我可以稍后通过它在内存中的地址或 id 调用该 lambda 函数吗?
或者我可以有一些“指针”,比如 C 中的什么来指向那部分内存?
在下图中,您可以看到我写了两次 lambda 表达式,发现它们在内存中的地址相同,但是如果我将“lambda x:x**2”分配给变量 a,则地址不同。
我想根据它在内存中的地址使用那个 lambda 函数“lambda x:x**2”。
谢谢。
解决方案
您看到两个 lambda 定义的相同 id 的事实是一个实现细节 - 第一个 lambda 被立即收集(因为没有引用它),所以 id 可以免费重用,并且恰好被第二个重用。
不,Python 不是 C 语言,activeley 阻止了任何直接的内存访问。请注意,CPython 的对象 id 是内存地址这一事实也是一个实现细节——它不是语言定义的一部分,并且其他实现(例如 Jhython)可以自由地将其他东西用于对象 id。
如果你想使用一个 lambda(实际上 a function
-lambda
只是语法糖并且function
像常规def
语句一样产生一个对象),那么你必须有一个对它的引用(作为一个变量,作为一个函数参数 - 这实际上是一个变量 - ,作为集合中的元素,作为对象的属性等)。
请注意,这也不是特定于函数的,Python 函数是对象(提示:您可以在 Python 中放在 LHS 上的所有内容都是对象),以上适用于所有对象。
我想知道我是否可以根据它在内存中的地址给一个对象起一个名字来调用或使用
你觉得foo = lambda x: x*2
在做什么?它“给一个对象一个名字”(或者更准确地说“将一个对象绑定到一个名字”),所以你可以稍后使用它,并且绑定(内部)依赖于对象的 id / 内存地址 / 等来访问该对象。
如果您希望了解 Python,您首先需要停止思考 C 概念并学习 Python 概念。
推荐阅读
- android - 从 Android Player SDK 中的 adb.exe 获取“错误:设备脱机”/设置 Unity Remote 5(已解决)
- hive - 我在尝试运行我的 sqoop 作业时出错(尝试将表从 oracle 复制到 hive)
- c# - WPF:如何将图像动态添加到数据网格?
- django - 在 Django 中使用默认 URL 值会引发 404 错误
- sql - SQL Server 脚本方程式
- hadoop - 在pyspark中如何计算?
- ios - 在 Swift 中使用按钮添加变量和返回数字
- java - SSL VPN 连接到使用 Java 的 Fortinet 防火墙
- javascript - 如何在 JSON 对象中连接双引号字符串
- mobile - Arduino MKR NB 1500 - 信号丢失后重新连接