鱼C论坛

 找回密码
 立即注册
查看: 1650|回复: 1

注释是否正确?另外为何内存地址前后不一?

[复制链接]
发表于 2023-6-9 08:56:51 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 lzb1001 于 2023-6-9 08:58 编辑

def make_repeat(n):

        return lambda s: s * n

>>> make_repeat(2) # 调用函数make_repeat(),并传入参数n = 2
<function make_repeat.<locals>.<lambda> at 0x000001D45F0CE288> # 返回lambda函数对象本身

>>> double = make_repeat(2) # 将函数本身赋给中间变量double,或者说将中间变量double指向函数

>>> print(double)
<function make_repeat.<locals>.<lambda> at 0x000001D45F0CE3A8> # 输出lambda函数对象本身,前后内存地址为何不同?

>>> double(8) # 调用lambda函数,并传入参数s = 8,计算s * n即8 * 2
16

>>> print(double(8))
16

>>> double('FishC') # 调用lambda函数,并传入参数s = 'FishC',计算s * n即'FishC' * 2,星号*为重复运算符
'FishCFishC'

>>> print(double('FishC'))
FishCFishC


【我的问题】

1、以上注释为我个人理解,不知是否正确、准确?

2、double不是可以理解为lambda函数的别名吗?为何前后内存地址(见红色字体)不同?

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-6-9 10:20:14 | 显示全部楼层
1、你的注释基本上是准确的。 make_repeat(n) 确实返回了一个新的lambda函数,这个函数接受一个参数 s ,然后返回 s 的 n 倍。然后你把这个新的函数赋给了 double ,所以当你调用 double(8) 或 double('FishC') 时,你实际上是在调用那个lambda函数,参数 n 已经固定为2了。

2、 double 确实可以被理解为这个特定lambda函数的别名。然而,内存地址的变化可能是因为Python的内存管理机制。当你打印函数对象时,Python会显示该对象的内存地址。然而,这个内存地址不一定始终不变,特别是在像Python这样的高级语言中,它有自己的内存管理和垃圾回收机制。

在你的代码中,每次调用 make_repeat(n) 都会返回一个新的lambda函数,这个新的函数可能会在不同的内存位置。并且即使你给它赋了一个变量名(如 double ),这个函数的内存位置也可能随着时间和环境的变化而变化。

实际上,对大部分Python开发者来说,函数或其他对象的确切内存位置并不重要,因为Python自己会处理所有的内存管理问题。你只需要知道 double 是一个指向特定函数的引用,而不需要关心这个函数在内存中的确切位置。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-27 11:26

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表