我们可以在Python中的任何地方定义函数,这非常方便。但是在循环中定义函数是一个好习惯吗?它会在运行时引起任何不必要的开销吗?
答案 0 :(得分:2)
正如@cᴏʟᴅsᴘᴇᴇᴅ指出的那样,每次都会重新创建该函数,这可以通过dis.dis
看到:
>>> import dis
>>> code = """
... for i in range(3):
... def foo(j):
... print(j)
... foo(i)
... """
>>> dis.dis(code)
2 0 SETUP_LOOP 32 (to 34)
2 LOAD_NAME 0 (range)
4 LOAD_CONST 0 (3)
6 CALL_FUNCTION 1
8 GET_ITER
>> 10 FOR_ITER 20 (to 32)
12 STORE_NAME 1 (i)
3 14 LOAD_CONST 1 (<code object foo at 0x107544810, file "<dis>", line 3>)
16 LOAD_CONST 2 ('foo')
18 MAKE_FUNCTION 0
20 STORE_NAME 2 (foo)
5 22 LOAD_NAME 2 (foo)
24 LOAD_NAME 1 (i)
26 CALL_FUNCTION 1
28 POP_TOP
30 JUMP_ABSOLUTE 10
>> 32 POP_BLOCK
>> 34 LOAD_CONST 3 (None)
36 RETURN_VALUE
正如@avigil建议的那样,最好在循环外定义函数并将循环变量作为参数传递。