Python 列表推导与 for 语句行为比较
编辑:我之前的逻辑有点混乱。这里的“none”只是从理解中返回的结果。 我在用Python做一些测试时,发现执行顺序有点不同,这让我对它的实现有了些理解,但我想跟大家确认一下我是否理解正确,或者还有其他的情况。看看这段代码:
>>> a = ["a","b","c","d","e"]
>>> def test(self,arg):
... print "testing %s" %(arg)
... a.pop()
...
>>>[test(elem) for elem in a]
testing a
testing b
testing c
[None, None, None]
>>> a
['a', 'b']
#now we try another syntax
>>> a = ["a","b","c","d","e"]
>>> for elem in a:
... print "elem is %s"%(elem)
... test(elem)
...
elem is a
testing a
elem is b
testing b
elem is c
testing c
>>> a
['a', 'b']
>>>
这段代码告诉我,for elem in a: 是逐个获取可迭代对象中的元素,然后执行代码块。而列表推导式似乎是在实际执行函数中的代码之前,就对列表中的每个元素调用了这个函数。所以,如果在函数中修改了列表(比如用pop),就会导致返回的结果是 [none, none, none]。
我这样理解对吗?这里到底发生了什么?
谢谢!
3 个回答
0
它已经到了 "c"
,然后列表里的元素就用完了。因为 test
没有返回任何东西,所以你得到的结果是 [None, None, None]
。
1
在编程中,有时候我们会遇到一些问题,可能是因为代码写得不够好,或者是我们对某些概念理解得不够透彻。比如说,有人可能在使用某个库的时候,发现它的功能没有达到预期,这时候就需要仔细检查代码,看看是不是哪里出错了。
另外,编程的世界变化很快,新的技术和工具层出不穷。因此,保持学习的态度是非常重要的。无论是通过阅读文档、参加讨论,还是观看教程,都是提升自己技能的好方法。
总之,遇到问题时不要气馁,认真分析,积极寻求帮助,慢慢你就会变得更加熟练。
>>> a = ["a","b","c","d","e"]
>>> i = iter(a)
>>> next(i)
'a'
>>> a.pop()
'e'
>>> next(i)
'b'
>>> a.pop()
'd'
>>> next(i)
'c'
>>> a.pop()
'c'
>>> next(i)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
StopIteration
>>>
4
你的 test
函数没有 return
语句,所以在列表推导式中使用它会得到一堆 None
。在 Python 的交互式提示符中,它会显示最后一条语句的返回结果。
举个例子:
>>> def noop(x): pass
...
>>> [noop(i) for i in range(5)]
[None, None, None, None, None]
所以其实在你的问题中,列表推导式和 for
循环的工作方式是没有区别的。