美文网首页
python 函数缺省形参为可变数据类型时,应注意

python 函数缺省形参为可变数据类型时,应注意

作者: 隐墨留白 | 来源:发表于2018-11-13 18:12 被阅读0次

定义有默认参数的函数时,确实为我们提供了方便。但是如果默认参数为可变数据类型时,就应该注意了。
下面来看一道在多次笔试中出现的题:

def f(x, l = []):     #pycharm中空列表会代码高亮,警告默认参数是可变的(Default argument value is mutable)
   print('l = ',l,'******')
   for i in range(x):
       l.append(i*i)
   print(l)
f(2)
f(3,[3,2,1])
f(3)

#运行结果
l =  [] ******
[0, 1]
l =  [3, 2, 1] ******
[3, 2, 1, 0, 1, 4]
l =  [0, 1] ******
[0, 1, 0, 1, 4]
Process finished with exit code 0

这道题被要求手写,不注意的肯定会掉入f(3)的坑中,写个[0,1,4]。这是为什么呢?当可变参数l为默认时,每调用运行一次该函数,都会使参数l发生改变。
来看一个简单的例子原文

def f(l=[]):  # 其实这里写的时候pycharm就会有警告提示:默认参数是可变的
    l.append(1)
    return l


#改变了默认参数的值
print(f())
#当使用默认参数时的函数调用会受影响
print(f())
#传入参数时的函数调用不受影响
print(f([3, 3]))


#运行结果:
[1]
[1, 1]
[3, 3, 1]

那如何纠正呢(其他可变类型类似,推荐第二种方法)?

def f(x):
    l = []
    for i in range(x):
        l.append(i*i)
    print(l)
f(2)
f(3)

[0, 1]
[0, 1, 4]
Process finished with exit code 0



#第二种方法
def f(l=None):
    # 在内部给l赋值
    l = l or []
    l.append(1)
    return l

print(f())
print(f())
print(f([3, 3]))

# 运行结果:
[1]
[1]
[3, 3, 1]
Process finished with exit code 0

如果还是不理解,请看下面的代码:

def f(x, l = []):
    print('l = ',l,'*********空间地址:',id(l))
    for i in range(x):
       l.append(i*i)
    print(l)
f(2)
l = [3,2,1]
print('*********空间地址:',id(l))
f(3,l)
f(3)

#运行结果
#f(2)的结果
l =  [] *********空间地址: 95694216
[0, 1]
#f(3,[3,2,1])的结果
*********空间地址: 95690888
l =  [3, 2, 1] *********空间地址: 95690888
[3, 2, 1, 0, 1, 4]
#f(3)的结果
l =  [0, 1] *********空间地址: 95694216
[0, 1, 0, 1, 4]

Process finished with exit code 0

由此可见,当函数f()执行时,使用默认参数l,则l指向的是同一空间地址,所以随着代码的执行,列表l里的元素会不断增加。如果不使用默认参数l=[],即传入参数列表,则指向的是传入列表的空间地址,是一个新的地址空间,不会受默认参数列表的影响。这下应该懂了吧。。。

相关文章

  • python 函数缺省形参为可变数据类型时,应注意

    定义有默认参数的函数时,确实为我们提供了方便。但是如果默认参数为可变数据类型时,就应该注意了。下面来看一道在多次笔...

  • python notes 1

    python 笔记 列表的一些问题 列表是可变对象,字符串为不可变对象。 当列表作为函数的参数时,函数定义中的形参...

  • 函数与数组

    当函数的形参为基本数据类型时,是值传递,函数内部改变形参,外部实参的值不变 当函数的形参为数组时,是内存地址的传递...

  • python函数

    python函数 什么是函数 函数语法 调用函数 函数参数形参与实参传参指定参数传参参数默认值可变参数参数解包参数...

  • python基础函数

    python课程总结(2) [TOC] 函数的四种类型 全局变量 缺省参数 传参方式 不定长参数 函数的注意事项 ...

  • golang学习笔记之-函数可变参数

    语法 注意点: 如果函数的参数是可变参数,同时还有其他的参数。可变参数要放在形参列表的最后 一个函数的参数列表中,...

  • 可变参数列表

    在使用函数函数时,函数得形参并没有确定,这时就需要一个可变形参的出现。可变参数列表完全符合这个要求。其实,在一开始...

  • JavaScript基础 函数传参

    实参:实际参数(所有的数据类型都可做实参)形参:形式参数(变量) 实参与形参一一对应; 例: 例题: 注意:局部变...

  • 简书样式测试

    Python基本语法&结构 函数 定义 参数 位置参数 参数传入时, 实参与形参位置一一对应 默认参数 设置默认参...

  • Swift 函数

    函数定义 语法 实例 以下我们定义了一个函数名为 runoob 的函数,形参的数据类型为 String,返回值也为...

网友评论

      本文标题:python 函数缺省形参为可变数据类型时,应注意

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