huyanmin 发表于 2021-5-3 08:19:41

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

本帖最后由 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>
'''

wp231957 发表于 2021-5-3 08:44:28

id的那个就是变量在内存中的地址,自然不可能每次都一样
下面的是函数计算后的一个值,这个要是发生变化,那还要计算机干嘛

huyanmin 发表于 2021-5-3 12:26:27

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

没明白

小伤口 发表于 2021-5-4 09:04:00

本帖最后由 小伤口 于 2021-5-4 09:12 编辑

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

huyanmin 发表于 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都相同

小伤口 发表于 2021-5-4 11:40:33

huyanmin 发表于 2021-5-4 11:08
>>> a,b,c = 1,1,1
>>> a
1


好家伙翻车了,我再想想吧{:10_245:}

huyanmin 发表于 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,希望老师指点迷津?我也知道函数名不带括号,是代表函数体本身
页: [1]
查看完整版本: python 为什么每次运行程序,id值都不同,而下面print(f1)却不变化,求详解