注释是否正确?另外为何内存地址前后不一?
本帖最后由 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函数的别名吗?为何前后内存地址(见红色字体)不同?
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 是一个指向特定函数的引用,而不需要关心这个函数在内存中的确切位置。
页:
[1]