这两个代码之间有什么区别吗?
Is there any difference between these 2 code?
哪种方式使用for循环更好?
我应该在for循环中使用它之前定义变量还是不定义也可以使用它?
test_list = get_list()
for value in test_list:
pass
或
for value in get_list():
pass
它们将是等价的。 Python 不会在每次迭代期间调用 get_list()
,只会在第一次迭代时调用。
要比较代码并了解它是如何编译的,您可以使用 dis 模块。
import dis
code1 = """
test_list = get_list()
for value in test_list:
pass
"""
code2 = """
for value in get_list():
pass
"""
print("code1:")
dis.dis(code1)
print("code2:")
dis.dis(code2)
你得到:
code1:
2 0 LOAD_NAME 0 (get_list)
2 CALL_FUNCTION 0
4 STORE_NAME 1 (test_list)
4 6 SETUP_LOOP 12 (to 20)
8 LOAD_NAME 1 (test_list)
10 GET_ITER
>> 12 FOR_ITER 4 (to 18)
14 STORE_NAME 2 (value)
5 16 JUMP_ABSOLUTE 12
>> 18 POP_BLOCK
>> 20 LOAD_CONST 0 (None)
22 RETURN_VALUE
code2:
2 0 SETUP_LOOP 14 (to 16)
2 LOAD_NAME 0 (get_list)
4 CALL_FUNCTION 0
6 GET_ITER
>> 8 FOR_ITER 4 (to 14)
10 STORE_NAME 1 (value)
3 12 JUMP_ABSOLUTE 8
>> 14 POP_BLOCK
>> 16 LOAD_CONST 0 (None)
18 RETURN_VALUE
哪种方式使用for循环更好?
我应该在for循环中使用它之前定义变量还是不定义也可以使用它?
test_list = get_list()
for value in test_list:
pass
或
for value in get_list():
pass
它们将是等价的。 Python 不会在每次迭代期间调用 get_list()
,只会在第一次迭代时调用。
要比较代码并了解它是如何编译的,您可以使用 dis 模块。
import dis
code1 = """
test_list = get_list()
for value in test_list:
pass
"""
code2 = """
for value in get_list():
pass
"""
print("code1:")
dis.dis(code1)
print("code2:")
dis.dis(code2)
你得到:
code1:
2 0 LOAD_NAME 0 (get_list)
2 CALL_FUNCTION 0
4 STORE_NAME 1 (test_list)
4 6 SETUP_LOOP 12 (to 20)
8 LOAD_NAME 1 (test_list)
10 GET_ITER
>> 12 FOR_ITER 4 (to 18)
14 STORE_NAME 2 (value)
5 16 JUMP_ABSOLUTE 12
>> 18 POP_BLOCK
>> 20 LOAD_CONST 0 (None)
22 RETURN_VALUE
code2:
2 0 SETUP_LOOP 14 (to 16)
2 LOAD_NAME 0 (get_list)
4 CALL_FUNCTION 0
6 GET_ITER
>> 8 FOR_ITER 4 (to 14)
10 STORE_NAME 1 (value)
3 12 JUMP_ABSOLUTE 8
>> 14 POP_BLOCK
>> 16 LOAD_CONST 0 (None)
18 RETURN_VALUE