python的函数调用和参数传递
不可变对象(immutable):int、string、float、number、tuple
可变对象(mutable):dict、list
对于基本数据类型的变量,变量传递给函数后,函数会在内存中复制一个新的变量,从而不影响原来的变量。(我们称此为值传递)
但是对于list来说,列表传递给函数的是一个指针,指针指向序列在内存中的位置,在函数中对表的操作将在原有内存中进行,从而印象原有变量。(我们称此为指针传递)
如何定义函数?
- 以 def 关键词开头,后接函数标识符名称和圆括号()。
- 任何传入参数和自变量必须放在圆括号中间。圆括号之间可以用于定义参数。
- 函数内容以冒号起始,并且缩进。
- return [表达式] 结束函数,选择性地返回一个值给调用方。不带表达式的return相当于返回 None。
关于不可变对象类型的函数定义、调用和传参:
# -*- coding:utf-8 -*- a = 1 def change_a_1(a): a += 1 print a return a def change_a_2(a): a += 1 print a print a print change_a_1(a) print a a = change_a_1(a) print a a = change_a_2(a) print a
最终打印出来的结果有几个?又分别是什么?主要涉及三个知识点,函数的定义、函数的调用以及传参,一旦弄清楚了,就很容易回答这个问题了。
函数的定义:
a = 1 def change_a_1(a): a += 1 print a return a def change_a_2(a): a += 1 print a
函数的调用:
print change_a_1(a) print a
注意:函数的定义与函数的执行,是两个过程。定义的函数如果不调用是不会执行的!
所以说,最终的打印结果和返回结果如下:
print a #1 print change_a_1(a) #2(函数return的返回值),2(函数内部的打印结果) print a #1 a = change_a_1(a) print a #2,2 a = change_a_2(a) print a #3(函数内部一次),None(最终打印结果)
关于全局变量和局部变量:
如果函数内任意地方有赋值,那么这个被解释为局部变量;
如果函数内没有赋值,函数之前有赋值,那么将被解释为全局变量。
注意:函数内部禁止使用全局变量!(#注释后为打印值)
def change_a_3(a): a = 6 a += 1 print a return a a = 2 print change_a_3(a) #7,7 print a #2 a = change_a_3(a) print a #7,7
关于可变对象类型的函数定义、调用和传参:
b = [1, 2, 3, 4] def change_b(b): b = b[1] print b return b def change_b_1(b): b.append(13) print b return b def change_b_2(b): b = [9, 7, 6, 6, 4] b.append(13) print b return b print b #[1,2,3,4] b.pop(1) print b #[2,3,4] print change_b(b) #3,3 print b #[2,3,4] b = change_b(b) print b #3,3 b = [1, 2, 3, 4] print change_b_1(b) #[1,2,3,4,13],[1,2,3,4,13] print change_b_1(b) #[1,2,3,4,13,13],[1,2,3,4,13,13] print change_b_2(b) #[9,7,6,6,4,13] print change_b_2(b) #[9,7,6,6,4,13]
1.当函数的传入参数代表唯一的值,也就是像int这种内部无法改变的,外部的变量是无法修改的。对同名的外部变量赋值,也无法改变外部变量的值。
2.当函数传入参数是像list,dict,类对象这样代表一个集合的话,可以对传入参数的内部做修改,引起外部变量值的变化。但是对同名的外部变量直接赋值,是不会改变外部变量的结果的。