教程集 www.jiaochengji.com
教程集 >  Python编程  >  Python入门  >  正文 python新手常见问题一:乱用表达式

python新手常见问题一:乱用表达式

发布时间:2021-12-28   编辑:jiaochengji.com
教程集为您提供python新手常见问题一:乱用表达式等资源,欢迎您收藏本站,我们将为您提供最新的python新手常见问题一:乱用表达式资源

<span style="color: rgb(20, 25, 30); font-family: "Microsoft Yahei", "Hiragino Sans GB", Helvetica, "Helvetica Neue", 微软雅黑, Tahoma, Arial, sans-serif; font-size: 14px;"></span>

<span style="color: rgb(20, 25, 30); font-family: "Microsoft Yahei", "Hiragino Sans GB", Helvetica, "Helvetica Neue", 微软雅黑, Tahoma, Arial, sans-serif; font-size: 14px;">在函数参数中乱用表达式作为默认值</span>

<span style="color: rgb(20, 25, 30); font-family: "Microsoft Yahei", "Hiragino Sans GB", Helvetica, "Helvetica Neue", 微软雅黑, Tahoma, Arial, sans-serif; font-size: 14px;">Python允许给一个函数的某个参数设置默认值以使该参数成为一个可选参数。尽管这是这门语言很棒的一个功能,但是这当这个默认值是可变对象(mutable)时,那就有些麻烦了。例如,看下面这个Python函数定义:</span>

<pre class="brush:php;toolbar:false">>>> def foo(bar=[]):         # bar是可选参数,如果没有指明的话,默认值是[] ...    bar.append("baz")     # 但是这行可是有问题的,走着瞧… ...    return bar</pre>

人们常犯的一个错误是认为每次调用这个函数时不给这个可选参数赋值的话,它总是会被赋予这个默认表达式的值。例如,在上面的代码中,程序员可能会认为重复调用函数foo() (不传参数bar给这个函数),这个函数会总是返回‘baz’,因为我们假定认为每次调用foo()的时候(不传bar),参数bar会被置为[](即,一个空的列表)。

相关推荐:《Python视频教程》

那么我们来看看这么做的时候究竟会发生什么:

<pre class="brush:php;toolbar:false">>>> foo() ["baz"] >>> foo() ["baz", "baz"] >>> foo() ["baz", "baz", "baz"]</pre>

嗯?为什么每次调用foo()的时候,这个函数总是在一个已经存在的列表后面添加我们的默认值“baz”,而不是每次都创建一个新的列表?

答案是一个函数参数的默认值,仅仅在该函数定义的时候,被赋值一次。如此,只有当函数foo()第一次被定义的时候,才讲参数bar的默认值初始化到它的默认值(即一个空的列表)。当调用foo()的时候(不给参数bar),会继续使用bar最早初始化时的那个列表。

由此,可以有如下的解决办法:

<pre class="brush:php;toolbar:false">>>> def foo(bar=None): ...    if bar is None:       # 或者用 if not bar: ...        bar = [] ...    bar.append("baz") ...    return bar ... >>> foo() ["baz"] >>> foo() ["baz"] >>> foo() ["baz"]</pre>

您可能感兴趣的文章:
Python新手常见问题二:不正确的使用类变量
python新手常见问题一:乱用表达式
Python新手常见问题五:在遍历列表的同时又修改该列表
Python新手常见问题六:闭包时绑定变量
学会了Python语言能做什么
python为何如此流行
PHP URL传递中文乱码问题解决办法
python表达式是什么
解决PHP提交MYSQL数据库中文内容乱码方法
python u是什么意思

[关闭]
~ ~