芽筑说吧 关注:94贴子:1,861

<经验贴>Python编程时初学者易犯的错误

只看楼主收藏回复



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


    2楼2018-08-14 16:57
    回复
      这些错误会造成很麻烦的问题,需要数小时才能解决。
      当你做错事时,承认错误并不是一件容易的事,但是犯错是任何学习过程中的一部分,无论是学习走路,还是学习一种新的编程语言都是这样,比如学习 Python。


      3楼2018-08-14 16:57
      回复
        1、 可变数据类型作为函数定义中的默认参数
        这似乎是对的?你写了一个小函数,比如,搜索当前页面上的链接,并可选将其附加到另一个提供的列表中。


        4楼2018-08-14 16:58
        回复
          def search_for_links(page, add_to=[]):
          new_links = page.search_for_links()
          add_to.extend(new_links)
          return add_to


          5楼2018-08-14 16:58
          回复
            从表面看,这像是十分正常的 Python 代码,事实上它也是,而且是可以运行的。但是,这里有个问题。如果我们给 add_to 参数提供了一个列表,它将按照我们预期的那样工作。但是,如果我们让它使用默认值,就会出现一些神奇的事情。


            6楼2018-08-14 16:58
            回复
              def fn(var1, var2=[]):
              var2.append(var1)
              print var2
              fn(3)
              fn(4)
              fn(5)


              7楼2018-08-14 16:58
              回复
                每次都使用的是同一个列表,输出为什么会是这样?在 Python 中,当我们编写这样的函数时,这个列表被实例化为函数定义的一部分。当函数运行时,它并不是每次都被实例化。这意味着,这个函数会一直使用完全一样的列表对象,除非我们提供一个新的对象:


                8楼2018-08-14 16:58
                回复
                  fn(3, [4])
                  [4, 3]


                  9楼2018-08-14 16:58
                  回复
                    答案正如我们所想的那样。要想得到这种结果,正确的方法是:
                    def fn(var1, var2=None):
                    if not var2:
                    var2 = []
                    var2.append(var1)


                    10楼2018-08-14 16:59
                    回复
                      或是在第一个例子中:
                      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


                      11楼2018-08-14 16:59
                      回复
                        这将在模块加载的时候移走实例化的内容,以便每次运行函数时都会发生列表实例化。请注意,对于不可变数据类型,比如元组、字符串、整型,是不需要考虑这种情况的。这意味着,像下面这样的代码是非常可行的:
                        def func(message="my message"):
                        print message


                        12楼2018-08-14 16:59
                        回复
                          2、 可变数据类型作为类变量
                          这和上面提到的最后一个错误很相像。思考以下代码:
                          class URLCatcher(object):
                          urls = []
                          def add_url(self, url):
                          self.urls.append(url)


                          13楼2018-08-14 16:59
                          回复
                            该楼层疑似违规已被系统折叠 查看此楼


                            14楼2018-08-14 16:59
                            回复
                              该楼层疑似违规已被系统折叠 查看此楼


                              15楼2018-08-14 17:00
                              回复