美文网首页
可变对象作为默认参数时的编程陷进

可变对象作为默认参数时的编程陷进

作者: mysimplebook | 来源:发表于2019-12-02 09:30 被阅读0次

默认参数是在函数调用时,没有为参数提供值,而是使用预先定义的默认值。形参的格式为“para_name=default_value”。Python中用默认值声明变量的语法是所有的位置参数必须出现在任何一个默认参数之前。

def  function_name(position_para1,default-para=default_value1,…..):

         “函数说明注释”                        #python的注释方法

         function body

         return return_values

调用函数时可传可不传该默认参数的值。

默认参数的值仅仅在函数定义的时候赋值一次。再次赋值时将不起作用。如

>>> x=42

>>> defspam(a,b=x):

         print(a,b)

 

        

>>> spam(1)

1 42

>>> x=43             #不起作用

>>> spam(1)

1 42

>>> 

默认参数的值应该是不可变的对象,比如None、True、False、数字或字符串。如果默认参数是一个可修改的容器比如一个列表、集合或者字典,往往引起问题。因为在这种情况下参数可以在不创建新对象的情况下进行修改。如

>>> deffunc(data=[]):

...     data.append(1)

...     return data

...

>>> func()

[1]

>>> func()

[1, 1]

>>> func()

[1, 1, 1]

"Default parameter values are evaluated(求值)when the function definition is executed. This means that the expression is evaluated once, when the function is defined, and that the same “pre-computed”value is used for each call. This is especially important to understand when adefault parameter is a mutable object, such as a list or a dictionary: if thefunction modifies the object (e.g. by appending an item to a list), the defaultvalue is in effect modified. This is generally not what was intended.

这就是以可变对象作为默认参数的编程陷进,再比如,

>>> classQueEle():

...         def __init__(self,fpath=[],cur=None):

...                 self.fpath=fpath

...                 self.cur=cur

...

>>> 

>>> for iin range(3):

...     qe=QueEle()

...     qe.fpath.append((1,2))

...     print qe.fpath

...

[(1, 2)]

[(1, 2), (1, 2)]

[(1, 2), (1, 2), (1,2)]

>>> 

这里有两个解决方法,一是使用None作为默认值;二是在函数中使用list对实参做一份拷贝,避免共享,如

>>> deffunc2(data=[]):

...     ele=list(data)

...     ele.append(1)

...     return ele

...

>>> func2()

[1]

>>> func2()

[1]

 

>>> classQueEle():

...     def __init__(self,fpath=[],cur=None):

...             self.fpath=list(fpath)

...             self.cur=cur

...

>>> for iin range(3):

...     qe=QueEle()

...     qe.fpath.append((1,2))

...     print qe.fpath

...

[(1, 2)]

[(1, 2)]

[(1, 2)]

>>> 

相关文章

  • 可变对象作为默认参数时的编程陷进

    默认参数是在函数调用时,没有为参数提供值,而是使用预先定义的默认值。形参的格式为“para_name=defaul...

  • Python参数

    1.默认参数:默认参数必须指向不变对象! 2.可变参数:可变参数允许你传入 0 个或任意 个参数,这些可变参数在函...

  • Python 那些不为人知的冷知识

    1、默认参数最好不为可变对象 函数的参数分三种 可变参数 默认参数 关键字参数 Python 中的 def 语句在...

  • Python参数传递和一些坑

    Python 中的参数传递模式是共享传参 如果可变对象作为默认值的话,会导致一些问题 建议不要使用可变类型作为参数...

  • kotlin 函数、参数使用详解

    知识点概览:命名参数、默认参数值、可变参数、局部函数将函数作为参数传递 一、命名参数、默认参数值、可变参数、局部函...

  • 可变参数

    定义默认参数要牢记一点:默认参数必须指向不变对象! 在Python函数中,还可以定义可变参数。顾名思义,可变参数就...

  • 为什么禁止把函数参数默认值设置为可变对象?

    本文主要是对禁止使用可变对象作为参数默认值的编码规范进行了详细介绍。 今天给大家带来的是一篇编程规范方面的内容。 ...

  • 对象引用,可变性,垃圾回收

    Python的传参模式是call by sharing 共享传参 避免使用可变对象作为默认参数 CPython的垃...

  • 函数

    函数 定义: 空函数 参数检查 返回多个值 默认参数 默认参数必须为不变对象 需要改为 可变参数 将 list 转...

  • python之函数

    注意项:定义默认参数时,默认参数必须指向不可变对象。 异于其它语言的:函数可以返回多个值。例如:在游戏中位移和坐标...

网友评论

      本文标题:可变对象作为默认参数时的编程陷进

      本文链接:https://www.haomeiwen.com/subject/tgrxgctx.html