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

下面代码会输出什么:

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

答案:

[0,1)">]
[3,1,4]
[0,1,4]

第一个函数调用十分明显,for循环先后将0和1添加至了空列表l中。l是变量的名字,指向内存中存储的一个列表

第二个函数调用在一块新的内存中创建了新的列表。l这时指向了新生成的列表。之后再往新列表中添加0、1、2和4。很棒吧。

第三个函数调用的结果就有些奇怪了。它使用了之前内存地址中存储的旧列表。这就是为什么它的前两个元素是0和1了。

运行下面的代码看看:

print id(l)
    i)
     id(l)

   print '#########' f(2]) f(3)

结果为:

39443912
39443912
#########
39993928
39993928
########
39443912
39443912
########

不明白的话就试着运行下面的代码吧:

l_mem = []

l = l_mem            the first call
in range(2):
    l.append(i*i)

print l              [0,1]

l = [3,1]          the second call
in range(3 [3,4]

l = l_mem            the third call

相关文章

Python中的函数(二) 在上一篇文章中提到了Python中函数的定...
Python中的字符串 可能大多数人在学习C语言的时候,最先接触...
Python 面向对象编程(一) 虽然Python是解释性语言,但是它...
Python面向对象编程(二) 在前面一篇文章中谈到了类的基本定...
Python中的函数(一) 接触过C语言的朋友对函数这个词肯定非...
在windows下如何快速搭建web.py开发框架 用Python进行web开发...