【51CTO晃荡】8.26 带你深度懂得清华大年夜学、搜狗基于算法的IT运维实践与摸索
这些缺点会造成很麻烦的问题,须要数小时才能解决。
当你做错事时,承认缺点并不是一件轻易的事,然则犯错是任何进修过程中的一部分,无论是进修走路,照样进修一种新的编程说话都是如许,比如进修 Python。
年青的法度榜样员们可要留意了,这些缺点是会浪费一下昼的!
1、 可变数据类型作为函数定义中的默认参数
这似乎是对的?你写了一个小函数,比如,搜刮当前页面上的链接,并可选将其附加到另一个供给的列表中。
- def search_for_links(page, add_to=[]):
- new_links = page.search_for_links()
- add_to.extend(new_links)
- return add_to
大年夜外面看,这像是十分正常的 Python 代码,事实上它也是,并且是可以运行的。然则,这里有个问题。如不雅我们给 add_to 参数供给了一个列表,它将按照我们预期的那样工作。然则,如不雅我们让它应用默认值,就会出现一些神奇的工作。
尝尝下面的代码:
- b = a.copy()
谜底正如我们所想的那样。要想获得这种结不雅,精确的办法是:
- def fn(var1, var2=[]):
- var2.append(var1)
- print var2
- fn(3)
- fn(4)
- fn(5)
可能你认为我们将看到:
- [3]
- [4]
- [5]
但实际上,我们看到的倒是:
b.urls:
- [3]
- [3, 4]
- [3, 4, 5]
为什么呢?如你所见,每次都应用的是同一个列表,输出为什么会是如许?在 Python 中,当我们编写如许的函数时,这个列表被实例化为函数定义的一部分。当函数运行时,它并不是每次都被实例化。这意味着,这个函数会一向应用完全一样的列表对象,除非我们供给一个新的对象:
- fn(3, [4])
- [4, 3]
- def fn(var1, var2=None):
- if not var2:
- var2 = []
- var2.append(var1)
或是在第一个例子中:
- def search_for_links(page, add_to=None):
- if not add_to:
- add_to = []
- new_links = page.search_for_links()
- add_to.extend(new_links)
- return add_to
这将在模块加载的时刻移走实例化的内容,以便每次运行函数时都邑产生列表实例化。请留意,对于弗成变数据类型,比如元组、字符串、整型,是不须要推敲这种情况的。这意味着,像下面如许的代码是异常可行的:
- class URLCatcher(object):
- urls = []
- def add_url(self, url):
- self.urls.append(url)
这和膳绫擎提到的最后一个缺点很相像。思虑以下代码:
- a = URLCatcher()
推荐阅读
【51CTO晃荡】8.26 带你深度懂得清华大年夜学、搜狗基于算法的IT运维实践与摸索日前,苹不雅宣布了 iOS 11 的第五个公测版(Public Beta 5)。iOS 11 Beta 根本已经接近尾声,更新内容重要集中在 bug 修>>>详细阅读
本文标题:学习用Python编程时要避免的3个错误
地址:http://www.17bianji.com/lsqh/36767.html
1/2 1