不可变对象(immutable):int、string、float、number、tupleapp
可变对象(mutable):dict、list函数
对于基本数据类型的变量,变量传递给函数后,函数会在内存中复制一个新的变量,从而不影响原来的变量。(咱们称此为值传递)spa
可是对于list来讲,列表传递给函数的是一个指针,指针指向序列在内存中的位置,在函数中对表的操做将在原有内存中进行,从而印象原有变量。(咱们称此为指针传递)指针
如何定义函数?对象
关于不可变对象类型的函数定义、调用和传参:blog
# -*- 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
最终打印出来的结果有几个?又分别是什么?主要涉及三个知识点,函数的定义、函数的调用以及传参,一旦弄清楚了,就很容易回答这个问题了。内存
函数的定义:utf-8
a = 1 def change_a_1(a): a += 1 print a return a def change_a_2(a): a += 1 print a
函数的调用:string
print change_a_1(a) print a
注意:函数的定义与函数的执行,是两个过程。定义的函数若是不调用是不会执行的!table
因此说,最终的打印结果和返回结果以下:
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,类对象这样表明一个集合的话,能够对传入参数的内部作修改,引发外部变量值的变化。可是对同名的外部变量直接赋值,是不会改变外部变量的结果的。