Python变量如何使用?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。
Python编程中经常遇到一些莫名其妙的错误,其实这不是语言本身的问题,而是我们忽略了语言本身的一些特性导致的,今天就来看下使用Python变量时导致的3个不可思议的错误,以后在编程中要多多注意。
<强> 1,可变数据类型作为函数定义中的默认参数强>
这似乎是对的吗?你写了一个小函数,比如,搜索当前页面上的链接,并可选将其附加到另一个提供的列表中。
def search_for_links(页面,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) ,,,印刷(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): ,,,ifnot var2: ,,,,,,,var2 =[] ,,,var2.append (var1)
<强> 2,可变数据类型作为类变量强>
这和上面提到的最后一个错误很相像。思考以下代码:
class URLCatcher(对象): ,,,urls =[] ,,,def add_url(自我,url): ,,,,,,,self.urls.append (url)
这段代码看起来非常正常。我们有一个储存url的对象。当我们调用add_url方法时,它会添加一个给定的url到存储中。看起来非常正确吧?让我们看看实际是怎样的:
a =URLCatcher () a.add_url (& # 39; http://www.google.com& # 39;) b =URLCatcher () b.add_url (& # 39; http://www.pythontab.com& # 39;) 打印(b.urls) 打印(a.urls)
结果
[& # 39;http://www.google.com& # 39; & # 39; http://www.pythontab.com& # 39;】 [& # 39;http://www.google.com& # 39; & # 39; http://www.pythontab.com& # 39;]
等等,怎么回事? !我们想的不是这样啊。我们实例化了两个单独的对象a和b。把一个URL给了一个,另一个给了b。这两个对象怎么会都有这两个网址呢?
这和第一个错例是同样的问题。创建类定义时,URL列表将被实例化。该类所有的实例使用相同的列表。在有些时候这种情况是有用的,但大多数时候你并不想这样做。你希望每个对象有一个单独的储存为。此,我们修改代码为:
class URLCatcher(对象): ,,,def __init__(自我): ,,,,,,,self.urls =[] ,,,def add_url(自我,url): ,,,,,,,self.urls.append (url)
现在,当创建对象时,url列表被实例化。当我们实例化两个单独的对象时,它们将分别使用两个单独的列表。
<强> 3,可变的分配错误强>
这个问题困扰了我一段时间。让我们做出一些改变,并使用另一种可变数据类型——字典。
a ={& # 39; 1 & # 39;:“人,& # 39;2 & # 39;:& # 39;两个# 39;}
现在,假设我们想把这个字典用在别的地方,且保持它的初始数据完整。
b =, b [& # 39; 3 & # 39;]=& # 39; 3 # 39;
现在,让我们看看原来那个我们不想改变的字典:
{& # 39;1 & # 39;:“人,& # 39;2 & # 39;:& # 39;两个# 39;,& # 39;3 & # 39;:& # 39;3 # 39;}
哇等一下,我们再看看b ?
{& # 39;1 & # 39;:“人,& # 39;2 & # 39;:& # 39;两个# 39;,& # 39;3 & # 39;:& # 39;3 # 39;}Python变量如何使用