天天看点

python之疑惑函数默认初始化

def extendList(val, list=[]):

    list.append(val)

    return list

list1 = extendList(10)

list2 = extendList(123,[])

list3 = extendList('a')

print "list1 = %s" % list1 ,

print "list2 = %s" % list2

print "list3 = %s" % list3

许多人会错误的认为 <code>list1</code> 应该等于 <code>[10]</code> 以及 <code>list3</code> 应该等于 <code>['a']</code>。认为 <code>list</code> 的参数会在 <code>extendList</code> 每次被调用的时候会被设置成它的默认值 <code>[]</code>。

尽管如此,实际发生的事情是,新的默认列表仅仅只在函数被定义时创建一次。随后当 <code>extendList</code> 没有被指定的列表参数调用的时候,其使用的是同一个列表。这就是为什么当函数被定义的时候,表达式是用默认参数被计算,而不是它被调用的时候。

因此,<code>list1</code> 和 <code>list3</code> 是操作的相同的列表。而 ````list2<code>是操作的它创建的独立的列表(通过传递它自己的空列表作为</code>list``` 参数的值)。