作家
登录

学习用Python编程时要避免的3个错误

作者: 来源: 2017-08-17 12:20:51 阅读 我要评论

  • a.add_url('http://www.google.com'
  • b = URLCatcher() 
  • b.add_url('http://www.bbc.co.hk'
  • 这段代码看起来异常正常。我们有一个储存 URL 的对象。当我们调用 add_url 办法时,它会添加一个给定的 URL 到存储中。看起来异常精确吧?让我们看看实际是如何的:

    a = URLCatcher()a.add_url('http://www.google.com')b = URLCatcher()b.add_url('http://www.bbc.co.hk')

    1. ['http://www.google.com''http://www.bbc.co.uk'

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

    a.urls:

    1. ['http://www.google.com''http://www.bbc.co.uk'

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

    这和第一个错例是同样的问题。创建类定义时,URL 列表将被实例化。该类所有的实例应用雷同的列表。在有些时刻这种情况是有效的,但大年夜多半时刻你并不想如许做。你欲望每个对象有一个零丁的储存。为此,我们修改代码为:

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

    如今,当创建对象时,URL 列表被实例化。当我们实例化两个零丁的对象时,它们将分别应用两个零丁的列表。

    3、 可变的分派缺点

    这个问题困扰了我一段时光。让我们做出一些改变,并应用另一种可变数据类型 - 字典。

    1. a = {'1'"one"'2''two'

    如今,假设我们想把这个字典用在其余处所,且保持它的初始数据完全。

    1. b = a 
    2. b['3'] = 'three' 

    简单吧?

    如今,让我们看看本来那个我们不想改变的字典 a:

    1. {'1'"one"'2''two''3''three'

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

    1. {'1'"one"'2''two''3''three'

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

    1. c = (2, 3) 
    2. d = c 
    3. d = (4, 5) 

    如今 c 是 (2, 3),而 d 是 (4, 5)。

    这个函数结不雅如我们所料。那么,在之前的例子中到底产生了什么?当应用可变类型时,其行动有点像 C 说话的一个指针。在膳绫擎的代铝闼楝我们令 b = a,我们真正表达的意思是:b 成为 a 的一个引用。它们都指向 Python 内存中的同一个对象。听起来竽暌剐些熟悉?那是因为这个问题与先前的类似。其实,这篇文┞仿应当被称为「可变激发的麻烦」。

    列表也会产生同样的事吗?是的。那么我们若何解决呢?这必须异常当心。如不雅我们真的须要复制一个列表进行处理,我们可以如许做:

    1. b = a[:] 

    这将遍历并复制列表中的每个对象的引用,并且把它放在一个新的列表中。然则要留意:如不雅列表中的每个对象都是可变的,我们将再次获得它们的引用,而不是完全的副本。

    假设在一张纸上列清单。在本来的例子中相当于,A 某和 B 某正在看着同一张纸。如不雅有小我修改了这个清单,两小我都将看到雷同的变更。当我们复制引用时,每小我如今有了他们本身的清单。然则,我们假设这个清单包含寻找食物的处所。如不雅“冰箱”是列表中的第一个,即使它被复制,两个列表中的条目也都指向同一个冰箱。所以,如不雅冰箱被 A 修改,吃掉落潦攀琅绫擎的大年夜蛋糕,B 也将看到这个蛋糕的消掉。这琅绫腔有简单的办法解决它。只要你记住它,并编写代码的时刻,应用不会造成这个问题的方法。


      推荐阅读

      iOS Public Beta 5值得关注的7个变化

    【51CTO晃荡】8.26 带你深度懂得清华大年夜学、搜狗基于算法的IT运维实践与摸索日前,苹不雅宣布了 iOS 11 的第五个公测版(Public Beta 5)。iOS 11 Beta 根本已经接近尾声,更新内容重要集中在 bug 修>>>详细阅读


    本文标题:学习用Python编程时要避免的3个错误

    地址:http://www.17bianji.com/lsqh/36767.html

    关键词: 探索发现

    乐购科技部分新闻及文章转载自互联网,供读者交流和学习,若有涉及作者版权等问题请及时与我们联系,以便更正、删除或按规定办理。感谢所有提供资讯的网站,欢迎各类媒体与乐购科技进行文章共享合作。

    网友点评
    自媒体专栏

    评论

    热度

    精彩导读
    栏目ID=71的表不存在(操作类型=0)