力求改变 2021-06-05 00:19 采纳率: 50%
浏览 14

问题一堆,请大神指教!

def func():
    fs = [ ]
    for i in range(1,4):
        def f():
            return i * i
        fs.append(f)
    return fs
f1 = func()
print(f1)

运行结果是:

[<function func.<locals>.f at 0x01AD83D0>, <function func.<locals>.f at 0x01AD8388>, <function func.<locals>.f at 0x01AD84A8>]
[Finished in 0.2s]

再次打印一遍,稍加改动

def func():
    fs = [ ]
    for i in range(1,4):
        def f():
            return i * i
        fs.append(f)
    return fs
f1,f2,f3 = func()
print(f1(),f2(),f3())

运行结果是:9 9 9
[Finished in 0.3s]

为什么有如此不同?

我的问题是:1.为什么第二次代码里面,最后输出f1,f2,f3的时候,后面都加了括号? print(f1(),f2(),f3()) 

                      2.如果在第一次代码里面,最后输出print(f1)仿照第二次代码那样写成print ( f1() ) 就反而会报错?

                      3.第二次代码运行结果是 9 9 9 不懂为什么不是

  • 写回答

1条回答 默认 最新

  • 殊毅 2021-06-05 00:32
    关注

    1,加括号代表输出函数运行的结果,不加就代表输出函数对象本身

    2函数才能加括号,第二次返回的函数,第一次返回的是包含函数的列表

    3,第三个,你在循环里创建函数,我是第一次见到这么用的,我猜测是这样,在你循环时创建了三个函数但并没有调用所以这时的i无关,然后循环结束i最后赋值为3,然后最后你调用了三个函数这时i.还是3所以就输出了三个9

    本回答被专家选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥100 复现论文:matlab仿真代码编写
  • ¥15 esp32驱动GC9A01循环播放视频
  • ¥15 惠普360g9的最新bios
  • ¥30 这个功能用什么软件发合适?
  • ¥60 微信小程序,取消订单,偶尔订单没有改变状态
  • ¥15 用pytorch实现PPO算法
  • ¥15 关于调制信号的星座图?
  • ¥30 前端传参时,后端接收不到参数
  • ¥15 这是有什么问题吗,我检查许可证了但是显示有呢
  • ¥15 机器学习预测遇到的目标函数问题