当列表被传递给函数时,由于列表是一个可变对象,所以列表的内容肯回在函数调用后改变。
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]