首页 新闻 会员 周边

有人知道Python函数有默认入参时多次调用发生了什么吗?

0
悬赏园豆:5 [待解决问题]
#! /usr/bin/env python
# encoding:utf-8
import os
def extendlist(val,list=[]):
    list.append(val)
    return list
if __name__ == '__main__':
    list1 = extendlist(10)
    list2 = extendlist(123,[])
    list3 = extendlist('a')
    print(list1)  #[10, 'a']
    print(list2)  #[123]
    print(list3) #[10, 'a']
    '''
    为什么结果不是这个?
    [10]
    [123]
    ['a']
    '''
xqn2017的主页 xqn2017 | 初学一级 | 园豆:199
提问于:2018-01-17 17:16
< >
分享
所有回答(3)
0

list2 = extendlist(123,[])是函数的列表参数list指向了空列表对象,你去掉后面的[]就可以了

秋刀鱼Q | 园豆:191 (初学一级) | 2018-01-17 20:18
0

python 的默认参数 只赋值一次,所以别用数组之类的引用类型.

长蘑菇星人 | 园豆:1832 (小虾三级) | 2018-01-18 08:39
0

This inspection detects when a mutable value as list or dictionary is detected in a default value for an argument. Default argument values are evaluated only once at function definition time, which means that modifying the default value of the argument will affect all subsequent calls of the function.

官方解释.

你试试打印id(list1)和id(list3),是同一个地址

id(list2)是另一个地址,list1和list3使用的都是默认的那个列表,list2返回的是你传进去的那个列表.虽然都是空列表,但实际是两个空列表.

不可能出现

[10]

[123]

['a']

若你改变打印位置,顶多只能出现

[10]
[123]
[10, 'a']

Masako | 园豆:1893 (小虾三级) | 2018-01-18 10:07

为什么list1和list3会用同一个空列表,不应该各自使用各自默认的空列表么?list1/2/3各自都是空列表,我理解的是三个空列表,所以list1/2/3之间没有关系,实际上呢,list1和list3联系上了,就没明白他俩是怎么关联上的,是Python 的默认吗

支持(0) 反对(0) xqn2017 | 园豆:199 (初学一级) | 2018-01-24 09:53

@xqn2017: 长蘑菇星人回答了,默认参数只赋值一次.你看看官方解释那段英文.

很多教程上会说默认参数不能用可变类型.

支持(0) 反对(0) Masako | 园豆:1893 (小虾三级) | 2018-01-25 17:13
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册