鱼C论坛

 找回密码
 立即注册
查看: 4078|回复: 6

python 为什么每次运行程序,id值都不同,而下面print(f1)却不变化,求详解

[复制链接]
发表于 2021-5-3 08:19:41 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 huyanmin 于 2021-5-4 17:15 编辑
def count():
    fs =[]
    for i in range(1,4):
        def f():
            return i*i
        fs.append(f)
    return fs


f1,f2,f3 =count() 
                  

print(f1())    
print(f2())
print(f3())

print(id(f1))  #此处打印的id值,为什么每次运行程序,id值都不同,而下面print(f1)却不变化,求详解
print(id(f2))
print(id(f3))

print(f1)
print(f2)
print(f3)

'''
第一次运行结果:
9
9
9
2264566893152
2264566893296
2264566893440
<function count.<locals>.f at 0x0000020F42B48A60>  #此处的一串16进制数字代表什么意思?
<function count.<locals>.f at 0x0000020F42B48AF0>   #此处的一串16进制数字代表什么意思?
<function count.<locals>.f at 0x0000020F42B48B80>   #此处的一串16进制数字代表什么意思?

第二次运行结果:
9
9
9
3068290308704
3068290308848
3068290308992
<function count.<locals>.f at 0x000002CA645A9A60>
<function count.<locals>.f at 0x000002CA645A9AF0>
<function count.<locals>.f at 0x000002CA645A9B80>
'''
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-5-3 08:44:28 From FishC Mobile | 显示全部楼层
id的那个就是变量在内存中的地址,自然不可能每次都一样
下面的是函数计算后的一个值,这个要是发生变化,那还要计算机干嘛
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2021-5-3 12:26:27 | 显示全部楼层
wp231957 发表于 2021-5-3 08:44
id的那个就是变量在内存中的地址,自然不可能每次都一样
下面的是函数计算后的一个值,这个要是发生变化, ...

没明白
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-5-4 09:04:00 From FishC Mobile | 显示全部楼层
本帖最后由 小伤口 于 2021-5-4 09:12 编辑

你可以试试a,b,c=1然后打印他们的id,发现他们的id都不一样,其实变量赋值就是在内存开辟空间的过程,虽然他们的值是相等的,但其实是开辟三个为1的空间,id自然不一样。f1,f2,f3 =count(),就是函数返回值的内存地址,fi不加括号打印就是一个函数对象即<function count.<locals>.f at 0x0000020F42B48AF0这些东西,可以从字面意思理解为这个函数对象在本地的地址。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-5-4 11:08:01 | 显示全部楼层
小伤口 发表于 2021-5-4 09:04
你可以试试a,b,c=1然后打印他们的id,发现他们的id都不一样,其实变量赋值就是在内存开辟空间的过程,虽然 ...

>>> a,b,c = 1,1,1
>>> a
1
>>> print(a)
1
>>> id(a)
140723135125152
>>> id(b)
140723135125152
>>> id (c)
140723135125152
>>> a,b,c 的id都相同
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-5-4 11:40:33 From FishC Mobile | 显示全部楼层
huyanmin 发表于 2021-5-4 11:08
>>> a,b,c = 1,1,1
>>> a
1

好家伙翻车了,我再想想吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2021-5-4 17:38:36 | 显示全部楼层
wp231957 发表于 2021-5-3 08:44
id的那个就是变量在内存中的地址,自然不可能每次都一样
下面的是函数计算后的一个值,这个要是发生变化, ...


还是不明白,希望老师有时间详细讲解一下

>>> '%#o'% 9  #函数值9 的16进制0o11
'0o11'

每次执行程序print(f1()) 的值都是9,print(f1)都显示<function count.<locals>.f at 0x0000020F42B48A60> ,都是固定不变的,0x0000020F42B48A60这串16进制数字代表什么意思?看着像地址,但是每次id (f1)又
id值又变化,说它是函数的值也不对,此函数的值是9,9的16进制数字是0o11,希望老师指点迷津?我也知道函数名不带括号,是代表函数体本身
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-9 01:19

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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