- >>> a[1]
- [10]
- >>> a
- [[10], [10], [10], [10], [10], [10], [10], [10], [10], [10]]
我猜,这应当不是你预期的结不雅吧,究其原因,照样因为python中list是可变对象,上述的写法大年夜家都指向的同一个可变对象,精确的姿势
- >>> a = [[] for _ in xrange(10)]
- >>> a[0].append(10)
- >>> a
- [[10], [], [], [], [], [], [], [], [], []]
第五,在拜访列表的时刻,修改列表
列表(list)在python中应用异常广泛,当然经常会在拜访列表的时刻增长或者删除一些元素。比如,下面这个函数,试图删掉落列表中为3的倍数的元素:
- >>> def modify_lst(lst):
- ... for idx, elem in enumerate(lst):
- ... if elem % 3 == 0:
- ... del lst[idx]
测试一下,
- >>> lst = [1,2,3,4,5,6]
- >>> modify_lst(lst)
- >>> lst
- [1, 2, 4, 5]
似乎没什么错,不过这只是命运运限好
- >>> lst = [1,2,3,6,5,4]
- >>> modify_lst(lst)
- >>> lst
- [1, 2, 6, 5, 4]
膳绫擎的例子中,6这个元素就没有被删除。如不雅在modify_lst函数中print idx, item就可以发明端倪:lst在变短,但idx是递增的,所以在膳绫擎掉足的例子中,当3被删除之后,6变成了lst的第2个元素(大年夜0开端)。在C++中,如不雅遍历容器的时刻用迭代器删除元素,也会有同样的问题。
第六,闭包与lambda
这个也是老发展谈的例子,在其他说话也有类似的情况。先看一个例子:
- >>> def create_multipliers():
- ... return [lambda x:i*x for i in range(5)]
- ...
- >>> for multiplier in create_multipliers():
- ... print multiplier(2)
- ...
因为出现这个陷阱的时刻经常应用了lambda,所以可能会认为是lambda的问题,但lambda表示不肯意背这个锅。问题的本质在与python中的属性查找规矩,LEGB(local,enclousing,global,bulitin),在膳绫擎的例子中,i就是在闭包感化域(enclousing),而Python的闭包是 迟绑定 , 这意味着闭包顶用到的变量的值,是在内部函数被调用时萌芽获得的。
解决办法也很简单,那就是变闭包感化域为局部感化域。

网友点评
精彩导读
科技快报
品牌展示