福安网站开发,四川高速公路建设集团网站,鞍山千山,大连工业大学中外合作办学本文字数#xff1a;1575 字阅读本文大概需要#xff1a;4 分钟写在之前Python 提供了很多让使用者觉得舒服至极的功能特性#xff0c;但是随着不断的深入学习和使用 Python#xff0c;我发现其中存在着许多玄学的输出与之前预想的结果大相径庭#xff0c;这个对于初学者来… 本文字数1575 字阅读本文大概需要4 分钟写在之前Python 提供了很多让使用者觉得舒服至极的功能特性但是随着不断的深入学习和使用 Python我发现其中存在着许多玄学的输出与之前预想的结果大相径庭这个对于初学者来说难以理解但是在理解它们以后又会觉得是这么的有意思所以我准备了这个「有趣的 Python 特性」系列写一些我碰到或看到的一些你所不知道的「奇葩」这里面会涉及到在 Python2 和 Python3 中的异同希望大家能从学习的过程中体会到真正的乐趣。当心默认可变参数首先我们先来看一个例子def test_func(default_arg[]): default_arg.append(rocky0429) return default_arg我们都知道如果调用上述函数 1 次以后所出现的结果 test_func()[rocky0429]那么如果调用 2 次3 次呢你可以先自己思考一下再继续看下面的结果 test_func()[rocky0429, rocky0429] test_func()[rocky0429, rocky0429, rocky0429]咦明明我们的函数里明明对默认的可变参数赋值了为什么第 1 次调用是初始化的状态第 2 次第 3 次出现的结果就不是我们想要的了呢先别急我们再继续看下面的调用 test_func([])[rocky0429] test_func()[rocky0429, rocky0429, rocky0429, rocky0429]是不是更懵了其实出现这样的结果是因为 Python 中函数的默认可变参数并不是每次调用该函数时都会初始化。相反它们会使用最近分配的值作为默认值。在上述的 test_func([]) 的结果不同是因为当我们将明确的 [] 作为参数传递给 test_func() 的时候就不会使用 test_func 的默认值所以函数返回的是我们期望的值。在自定义函数的特殊属性中有个「 __defaults__」 会以元组的形式返回函数的默认参数。下面我们就用「 __defaults__」来演示一下以便让大家有个更直观的感觉 test_func.__defaults__ #还未调用([],) test_func() # 第 1 次[rocky0429] test_func.__defaults__ # 第 2 次的默认值([rocky0429],) test_func() # 第 2 次[rocky0429, rocky0429] test_func.__defaults__ # 第 2 次的默认值([rocky0429, rocky0429],) test_func([]) # 输入确定的 [][rocky0429] test_func.__defaults__ # 此时的默认值([rocky0429, rocky0429],)那么上面那种情况该如何避免呢毕竟我们还是希望在每次调用函数的时候都是初始化的状态的这个也很简单就是将 None 指定为参数的默认值然后检查是否有值传给对应的参数。所以对于文章开始的那个例子我们可以改成如下的形式def test_func(default_argNone): if not default_arg: default_arg [] default_arg.append(rocky0429) return default_arg以上完美解决。●有趣的 Python 特性 2 | 一个你绝对猜不到的结果。●有趣的 Python 特性 1 | 是谁吃掉了我的外部变量●有趣的 Python 特性 0 | 同样都是捕获异常为啥要不一样呐●扔掉压缩工具让我们用 Python 管理压缩包。完