学习Python第一语言这一年遇到的4个编码错误,JavaScript(我已经很擅长JavaScript了,正在写UI),当时主要收入代码是C#。我是通过开发我所知道的应用程序来学习Python的,所以我将很多JavaScript和C#的工作方式融入到我的代码中,这些代码很糟糕但有时会起作用。我花了一些时间阅读别人的代码并与他人交流以使我的语言更好。今天,我想和大家讨论一下我在学习Python的过程中(在代码方面)的一些错误。1.Python作用域的误解Python解析作用域是基于所谓的LEGB规则,OCAL,Local,Enclosing,Global,Built-in虽然看起来很简单,但当时让我有点迷惑,例如,下面的例子:对于上面的代码,我想让它工作并更改全局变量x以最终打印出6。但是,它突然变得奇怪并且没有按照我想象的方式输出,让我们看一下更改后的代码:到底他妈发生了什么?在一个代码段中,全局变量X给出了一个UnboundLocalError但是当我们尝试打印它时,它起作用了。原因与范围界定有关。当您分配给范围内的变量(例如函数范围)时,该变量成为该范围的本地变量,隐藏外部范围中任何类似命名的变量。这就是我们执行第一个场景x+=1时发生的情况。如果我们打算x像函数一样访问全局变量,foo()可以执行以下操作:通过使用关键字global,内部作用域可以访问在全局作用域中声明的变量,这意味着未在任何函数中定义的变量。同样,我们可以使用nonlocal来实现类似的效果:nonlocalasglobal允许您从外部作用域访问变量,但是,使用nonlocal您可以绑定到父作用域或全局作用域中的对象。2.在遍历列表的同时修改列表这在初学Python的开发者,甚至一些有经验的开发者中是很常见的。尽管有时看起来并不那么明显,但在某些情况下我们会修改当前正在迭代的数组,从而导致一些代码错误的行为,或者如果幸运的话,我们会收到一个错误并注意到它。但是让我举个例子来说明我的意思,假设给你一个数组,你需要将数组缩小为只包含偶数元素,你可以尝试这样的事情:在描述的场景中,删除列表或数组的元素,同时迭代,由于尝试访问不存在的项目,我们收到一条错误消息。这是一个不好的做法,应该避免,有更好的方法可以在python中实现类似的功能,其中包括列表推导:同样的功能也可以使用filter函数来实现,尽管它完成了工作,但有些人仍然认为这非Pythonic方法,我有一些我同意的事情,但我不想在这里讨论它们。继续:3.闭包中的变量绑定我问了一些python前辈,他们对下面这段代码的看法:对于很多人(包括我自己)来说,当第一次遇到这个问题时,我们认为结果会是:然而,代码实际上最终打印出完全不同的东西,我们很困惑为什么。事实证明,Python执行后期绑定行为,即在调用内部函数时查询闭包中使用的变量的值。因此,在我们的示例中,无论何时调用任何返回的函数,都会在调用i时在周围范围内查找该值。这个问题的解决方案可能看起来很老套,但它确实有效。通过使用lambda函数的默认参数传递值,我可以生成函数来执行所需的行为。我对这个解决方案很困惑,我仍然认为它不是很优雅,但有些人喜欢它。如果您知道此问题的另一种解决方案,请在评论中告诉我,我很乐意阅读。4、与Python标准库模块名称冲突这个问题在我刚开始学习的时候其实挺常见的,即使是现在,我有时也会犯这个错误。出现此问题是因为您将其中一个模块命名为与Python附带的标准库中的模块同名。(例如,您的代码中可能有一个名为email.py的模块,它与同名的标准库模块冲突)。也许名称冲突本身不会对您的代码造成任何问题,但有时我们会覆盖Python标准库的一个函数或模块,稍后在已安装的库中使用它会引发错误或行为不当。冲突,这是一个糟糕的情况。一个典型的错误如下:通过简单地创建一个列表变量,我们然后中断了对列表函数的访问。并且,即使有其他访问方法(例如__builtins__.list()),我们也应避免使用此类名称。最后,本文并没有涵盖开发人员在使用Python编码时常犯的所有错误,而是涵盖了最让我恼火的错误。如果您想了解更多有关如何编写出色的Python代码并避免其他错误的信息,我鼓励您订阅我的下一篇文章。
