将列表传递给函数

当列表被传递给函数时,由于列表是一个可变对象,所以列表的内容肯回在函数调用后改变。

def main():
    x =1
    y = [1,2,4]
    m(x, y)
    print("x is ", x)
    print("y[0] is", y[0])
def m(number, numbers):
    number = 1001
    numbers[0] = 5555

main()
#运行结果
x is  1  
y[0] is 5555 #

m被调用后,x保持为1,但y[0]被改变为5555,这是因为y和numbers都指向同一个列表对象。当m(x,y)被调用时,x和y的引用值被传递给number和numbers。由于y包含指向列表的引用值,现在,numbers包含的就是指向同一列表的相同引用值。英语number是不可变的,所以在一个函数里该bain它会创建一个实例,而函数外的原始实例并没有被改变。所以,在函数外面x仍然是1.

#以上照抄了书本原文,道理懂了,但理解的还不是很透彻,暂且记录。

将列表作为一个默认函数

def add(x, lst = []):
    if x not in lst:
        lst.append(x)
    return lst
def main():
    list1 = add(1) #lst 的默认值[]被创建,add(1)加到lst
    print(list1)

    list2 = add(2) #lst是[1]而不是[],add(2)执行时lst就变成[1,2]
    print(list2)

    list3 = add(3, [11, 12, 13, 14]) #给出列表参数[11,12,13,14],并且将这个列表传递给lst
    print(list3)

    list4 =add(4) #默认列表参数被使用,因为默认列表是[1,2],所以调用add(4)后,默认列表变成[1,2,4]
    print(list4)

main()
#运行结果
[1]
[1, 2] 
[11, 12, 13, 14, 3]
[1, 2, 4]

如果要默认列表每次在函数调用时都是[],可以修改成如下代码

def add(x, lst = None): 
    if lst == None:
        lst = []
    if x not in lst:
        lst.append(x)
    return lst
def main():
    list1 = add(1)
    print(list1)

    list2 = add(2)
    print(list2)

    list3 = add(3, [11, 12, 13, 14])
    print(list3)

    list4 =add(4)
    print(list4)

main()
#运行结果
[1]
[2]
[11, 12, 13, 14, 3]
[4]
posted @ 2016-01-14 16:26  Jeff_blog  阅读(173)  评论(0编辑  收藏  举报