问题一堆,请大神指教!

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,加括号代表输出函数运行的结果,不加就代表输出函数对象本身

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

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