传递的是不可变类型 string, tuple(),number中的内容是不可变的
def func1(num): print(num) #20 print('地址:'+ str(id(num))) num = 10 print(num) #10 print("地址:"+str(id(num))) num = 50 print(num) #50 print("地址:"+str(id(num))) temp = 20 func1(temp) print(temp) #20 print("地址:"+str(id(temp)))输出:
20 地址:140734475986352 10 地址:140734475986032 50 地址:140734475987312 20 地址:140734475986352同一地址指向同一值,num和temp并不是指固定的位置的值,num和temp中存储的是值的地址,传递的是地址内的值。
传递的是可变类型 list[],dict{},set是可变的
def func2(lis): print(lis) print("地址:"+str(id(lis))) lis[0] = 100 print(lis) print("地址:"+str(id(lis))) li = [1,2,3,4,5] print(li) print("地址:"+str(id(li))) func2(li) print(li) print("地址:"+str(id(li)))输出:
[1, 2, 3, 4, 5] 地址:2206866864904 [1, 2, 3, 4, 5] 地址:2206866864904 [100, 2, 3, 4, 5] 地址:2206866864904 [100, 2, 3, 4, 5] 地址:2206866864904函数始终改变的都是列表li地址中的内容,列表中的内容是可变的。
一个有趣的引用传递的例子:
def ddd(num=[]): for i in range(3): num.append(i) print(num) print("地址:" +str(id(num))) ddd() ddd([1, 3, 4]) ddd()输出:
[0, 1, 2] 地址:1381917352584 [1, 3, 4, 0, 1, 2] 地址:1381918833224 [0, 1, 2, 0, 1, 2] 地址:1381917352584第一次调用ddd()且没有传递参数时,使用值为空列表的默认参数地址; 当有传递参数时,使用传递参数的地址并按方法中的内容改变该地址中的值; 当没有传递参数时,再次使用默认参数地址并改变其中的内容。
给每一个参数定义一个关键字,通过关键字调用参数。优点:允许函数调用时的参数的顺序与定义时不一致。
优点:能处理比定义时更多的参数 。 如:
func1(*arr): print(arr) func1('1',' 4', 'hhh') #输出(1, 4, 'hhh') # *后面的变量存放所有未命名的变量参数,如没有指定参数内容则是一个空元组。 func2(**arr): print(arr) func2(x=1, y=6, z='hhhh') #输出:{'x': 1, 'y': 6, 'z': 'hhhh'} #**后面表示的是键值对的参数字典,如没有指定参数内容则是一个空字典。 func3(*args, **kwargs): pass #代表一个空语句lambda 参数1, 参数2, ……, 参数n:expression expression中不能包含其他语句,但可以调用其他函数。
sum = lambda num1, num2:num1 + num2 print(sum(1,2))输出:3
1.简单匿名函数 : lambda函数只是一个表达式,函数体比def简单。 2.不复用的函数 : 需要一个抽象简单的功能又不想单独命名定义一个函数。 3.为了代码清晰 : 简短更清晰易懂。