例1:
count = []
for i in range(1, 4):
def f():
return i * i
count.append(f)
f1, f2, f3 = count
print(f1, 'f1的运行结果为', f1())
print(f2, 'f1的运行结果为', f2())
print(f3, 'f1的运行结果为', f3())
这里本意是f1,f2,f3
分别对应i=1,2,3时的f
函数,但是当调用函数显示的时候,i 已经是3,所以得到的结果是一样的,并不能保留当时的i。
结果是:
<function f at 0x00000223F1FCEAF0> f1的运行结果为 9
<function f at 0x00000223F1FCEC10> f1的运行结果为 9
<function f at 0x00000223F1FCEE50> f1的运行结果为 9
例2:
count = []
for i in range(1, 4):
def f(j):
def g():
return j*j
return g
count.append(f(i))
f1, f2, f3 = count
print(f1, 'f1的运行结果为', f1())
print(f2, 'f1的运行结果为', f2())
print(f3, 'f1的运行结果为', f3())
这里,代码中f(j)将循环中i的值传给了j,i被实时保留了,得到了想要的结果。
函数f1,f2,f3
分别对应了i=1,2,3时的函数g
。
结果是:
<function f.<locals>.g at 0x000001B3A1A1EE50> f1的运行结果为 1
<function f.<locals>.g at 0x000001B3A1A1EAF0> f1的运行结果为 4
<function f.<locals>.g at 0x000001B3A1A1EF70> f1的运行结果为 9
注:
还需注意一个点,就是python在函数内部定义函数,内部定义的函数可以用外面函数的变量,而不用传进去。
例如:
for i in range(3):
def g():
print(i * i)
g()
结果是:
0
1
4
这与C语言不太一样,在C中,对于全局变量a,和在函数func1()
内部定义的局部变量a。
若在func1()
内部定义了函数func2()
,若func2()
没有将内部重定义的局部变量传入,那么自动寻找func1()
外部的全局变量a。
而python不需要传入参数就可以调用。