59_函数也是对象,内存底层分析

59.函数也是对象,内存底层分析

Python中,“一切都是对象”。实际上,执行def 定义函数后,系统就创建了相应的函数 对象。我们执行如下程序,然后进行解释:

def print_star(n):
    print("*"*n)
print(print_star) 
print(id(print_star))

c = print_star

c(3)

执行结果:

<function print_star at 0x0000000002BB8620>
45844000
***

上面代码执行 def 时,系统中会创建函数对象,并通过print_star 这个变量进行引用

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-r1oh9alc-1597999575099)(20B571132F9C47BBA26C5F183CAB3D9E)]

我们执行“c=print_star”后,显然将print_star 变量的值赋给了变量c,内存图变成了:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AUHHzTEP-1597999575101)(E23D3E35AD0F46EDAAADFBF7F62D7029)]

显然,我们可以看出变量cprint_star 都是指向了同一个函数对象。因此,执行c(3)和执 行 print_star(3)的效果是完全一致的。 Python 中,圆括号意味着调用函数。在没有圆括 号的情况下,Python会把函数当做普通对象

与此核心原理类似,我们也可以做如下操作:

zhengshu = int 
zhengshu("234")


In [17]: zhengshu = int

In [18]: zhengshu("234")
Out[18]: 234

In [19]:

显然,我们将内置函数对象 int()赋值给了变量 zhengshu,这样zhengshuint 都是指向 了同一个内置函数对象。当然,此处仅限于原理性讲解,实际开发中没必要这么做。

测试函数也是对象


def print_star(n):
    print('*'*n)


print_star(1) # *
c = print_star
c(2) # **
print(id(print_star)) # 19848480
print(id(c)) # 19848480
print(type(c))  # 这也是函数  <class 'function'>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值