Python的两个代码为何不是输出同一个结果,代码和结果如下:
第一个代码:
sandwich_orders = ['huotui', 'peigen', 'zhishi']
finished_sandwiches = []
for order in sandwich_orders:
print(f"I made your {order} sandwich.")
food = sandwich_orders.pop(0)
finished_sandwiches.append(food)
print(sandwich_orders)
print(finished_sandwiches)
结果输出为:
I made your huotui sandwich.
I made your zhishi sandwich.
['zhishi']
['huotui', 'peigen']
第二个代码如下:
sandwich_orders = ['huotui', 'peigen', 'zhishi']
finished_sandwiches = []
while sandwich_orders:
food = sandwich_orders.pop()
print(f"I nade your {food} sandwich.")
finished_sandwiches.append(food)
print(sandwich_orders)
print(finished_sandwiches)
输出结果如下:
结果输出为:
I nade your zhishi sandwich.
I nade your peigen sandwich.
I nade your huotui sandwich.
[]
['zhishi', 'peigen', 'huotui']
for是个迭代器,你在迭代过程中修改了可迭代对象的长度,会导致迭代出错
本来一开始order指向索引位置0的对象
你将它pop出来了,位置是1的对象索引变成了0,索引是2的对象变成了1
然后order指向1,迭代就结束了
0位置的对象被跳过了
pop是后入先出
for是先入先出
所以第一段是从列表的第一个元素开始输出,但pop(0)弹出的是最后一个元素。导致输出第一个元素后,第三个元素就被pop掉了,只能输出2个元素。
而第二段是先pop取出栈顶元素,也就是从最后一个元素开始逐个弹出并输出,然后加入新的列表,就不会丢失元素了
for order in sandwich_orders:
print(f"I made your {order} sandwich.")
food = sandwich_orders.pop(0)
finished_sandwiches.append(food)
循环第一次,['huotui', 'peigen', 'zhishi']里取第一个输出,然后 pop 掉第一个
循环第二次,他迭代到指针指向第二项,而数组已经变成了['peigen', 'zhishi'],所以输出 zhishi,peigen已经跳过去了
debug调试看一下就知道了