看起来很不错,简单清楚明了,but
- >>> a[1]
- [10]
- >>> a
- [[10], [10], [10], [10], [10], [10], [10], [10], [10], [10]]
我猜,这应当不是你预期的结不雅吧,究其原因,照样因为python中list是可变对象,上述的写法大年夜家都指向的同一个可变对象,精确的姿势
第十,gil
- >>> 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]
似乎没什么错,不过这只是命运运限好
- >>> def report(when=None):
- ... if when is None:
- ... when = time.time()
- ... return when
- ...
- >>> report()
- 1500113446.746997
- >>> report()
- 1500113448.552873
那么Python中哪些真正算得上陷阱呢?
- >>> 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++中,如不雅遍历容器的时刻用迭代器删除元素,也会有同样的问题。
如不雅逻辑比较简单,应用list comprehension是不错的留意
大年夜运行结不雅可以看到,在add 和 get函数中import的mymodule不是同一个module,ID不合。当然,在python2.7.10中,须要main.py的第13行才能出现如许的效不雅。你可能会问,谁会写出第13行如许的代码呢?事实上,在很多项目中,为了import的时刻便利,会往sys.path参加一堆路径。那么在项目中,大年夜家赞成一种import方法就异常有须要了
推荐阅读
跟着物联网设备的赓续出现,用户所碰到的严重的物联网安然问题不容忽视。分析师和专家经常评论辩论这个严重问题,人们须要采取积极主动的行动来竽暌功对和解决。根据调研机构Gartner公司的>>>详细阅读
本文标题:程序员必知的Python陷阱与缺陷列表
地址:http://www.17bianji.com/lsqh/36531.html
1/2 1

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