广东快乐十分-广东快乐十分开奖结果_广东快乐十分投注平台

Python编程中犯的三种错误,让你浪费一下午时间_电子有限公司

作者:Aileen 发布时间:2019-08-24 02:10:16 点击数:144广东快乐十分-广东快乐十分开奖结果_广东快乐十分投注平台

广东快乐十分-广东快乐十分开奖结果_广东快乐十分投注平台当你做错事时,承认错误并不是一件容易的事,但是犯错是任何学习过程中的一部分,无论是学习走路,还是学习一种新的编程语言都是这样,比如学习 Python。

为了让初学 Python 的程序员避免犯同样的错误,以下列出了我学习 Python 时犯的三种错误。这些错误要么是我长期以来经常犯的,要么是造成了需要几个小时解决的麻烦。

广东快乐十分-广东快乐十分开奖结果_广东快乐十分投注平台年轻的程序员们可要注意了,这些错误是会浪费一下午的!

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 参数提供了一个列表,它将按照我们预期的那样工作。但是,如果我们让它使用默认值,就会出现一些神奇的事情。

试试下面的代码:

广东快乐十分-广东快乐十分开奖结果_广东快乐十分投注平台def fn(var1, var2=[]):

var2.append(var1)

print var2

fn(3)

fn(4)

fn(5)

可能你认为我们将看到:

[3]

[4]

[5]

广东快乐十分-广东快乐十分开奖结果_广东快乐十分投注平台但实际上,我们看到的却是:

[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

这将在模块加载的时候移走实例化的内容,以便每次运行函数时都会发生列表实例化。请注意,对于不可变数据类型,比如元组、字符串、整型,是不需要考虑这种情况的。这意味着,像下面这样的代码是非常可行的:

def func(message=“my message”):

print message

2、 可变数据类型作为类变量

这和上面提到的最后一个错误很相像。思考以下代码:

class URLCatcher(object):

urls = []

def add_url(self, url):

self.urls.append(url)

广东快乐十分-广东快乐十分开奖结果_广东快乐十分投注平台这段代码看起来非常正常。我们有一个储存 URL 的对象。当我们调用 add_url 方法时,它会添加一个给定的 URL 到存储中。看起来非常正确吧?让我们看看实际是怎样的:

a = URLCatcher()

a.add_url(‘’)

广东快乐十分-广东快乐十分开奖结果_广东快乐十分投注平台b = URLCatcher()

广东快乐十分-广东快乐十分开奖结果_广东快乐十分投注平台b.add_url(‘’)

b.urls:

[‘’, ‘’]

a.urls:

广东快乐十分-广东快乐十分开奖结果_广东快乐十分投注平台[‘’, ‘’]

广东快乐十分-广东快乐十分开奖结果_广东快乐十分投注平台等等,怎么回事?!我们想的不是这样啊。我们实例化了两个单独的对象 a 和 b。把一个 URL 给了 a,另一个给了 b。这两个对象怎么会都有这两个 URL 呢?

这和第一个错例是同样的问题。创建类定义时,URL 列表将被实例化。该类所有的实例使用相同的列表。在有些时候这种情况是有用的,但大多数时候你并不想这样做。你希望每个对象有一个单独的储存。为此,我们修改代码为:

广东快乐十分-广东快乐十分开奖结果_广东快乐十分投注平台class URLCatcher(object):

广东快乐十分-广东快乐十分开奖结果_广东快乐十分投注平台def __init__(self):

广东快乐十分-广东快乐十分开奖结果_广东快乐十分投注平台self.urls = []

广东快乐十分-广东快乐十分开奖结果_广东快乐十分投注平台def add_url(self, url):

self.urls.append(url)

广东快乐十分-广东快乐十分开奖结果_广东快乐十分投注平台现在,当创建对象时,URL 列表被实例化。当我们实例化两个单独的对象时,它们将分别使用两个单独的列表。

3、 可变的分配错误

广东快乐十分-广东快乐十分开奖结果_广东快乐十分投注平台这个问题困扰了我一段时间。让我们做出一些改变,并使用另一种可变数据类型 – 字典。

广东快乐十分-广东快乐十分开奖结果_广东快乐十分投注平台a = {‘1’: “one”, ‘2’: ‘two’}

现在,假设我们想把这个字典用在别的地方,且保持它的初始数据完整。

b = a

广东快乐十分-广东快乐十分开奖结果_广东快乐十分投注平台b[‘3’] = ‘three’

简单吧?

现在,让我们看看原来那个我们不想改变的字典 a:

‘1’: “one”, ‘2’: ‘two’, ‘3’: ‘three’}

哇等一下,我们再看看 b?

{‘1’: “one”, ‘2’: ‘two’, ‘3’: ‘three’}

等等,什么?有点乱……让我们回想一下,看看其它不可变类型在这种情况下会发生什么,例如一个元组:

广东快乐十分-广东快乐十分开奖结果_广东快乐十分投注平台c = (2, 3)

d = c

广东快乐十分-广东快乐十分开奖结果_广东快乐十分投注平台d = (4, 5)

现在 c 是 (2, 3),而 d 是 (4, 5)。

document.write ('');