VB.net 2010 视频教程 VB.net 2010 视频教程 python基础视频教程
SQL Server 2008 视频教程 c#入门经典教程 Visual Basic从门到精通视频教程
当前位置:
首页 > Python基础教程 >
  • 使用Python变量时要避免的3个错误(2)

或是在第一个例子中:

1
2
3
4
5
6
def search_for_links(page, add_to=None):
    ifnot add_to:
        add_to =[]
    new_links = page.search_for_links()
    add_to.extend(new_links)
    return add_to

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

1
2
def func(message="my message"):
    print(message)

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

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

1
2
3
4
class URLCatcher(object):
    urls =[]
    def add_url(self, url):
        self.urls.append(url)

这段代码看起来非常正常。我们有一个储存 URL 的对象。当我们调用 add_url 方法时,它会添加一个给定的 URL 到存储中。看起来非常正确吧?让我们看看实际是怎样的:

1
2
3
4
5
6
=URLCatcher()
a.add_url('http://www.google.com')
=URLCatcher()
b.add_url('http://www.pythontab.com')
print(b.urls)
print(a.urls)

结果:

1
2
['http://www.google.com','http://www.pythontab.com']
['http://www.google.com','http://www.pythontab.com']

等等,怎么回事?!我们想的不是这样啊。我们实例化了两个单独的对象 a 和 b。把一个 URL 给了 a,另一个给了 b。这两个对象怎么会都有这两个 URL 呢?

 

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

1
2
3
4
5
class URLCatcher(object):
    def __init__(self):
        self.urls =[]
    def add_url(self, url):
        self.urls.append(url)

相关教程