python一号坑:函数内操作基础数据类型
话不多说,先上题
1号题:函数操作可哈希的数据类型的数据
n = 1 def func(n): n += 1 func(n) print(n)
输出答案:1
分析:在一题中,先定义一个n为1,在内存中将变量n指向存储值1的地址,随后遇到func(n),即将变量n为参数传入函数进行执行,而此时函数内部做了一个操作:就是在自己函数的局部命名空间里也创建了一个叫n的变量,也将内部的n变量指向值1的地址,这时函数内部的n自加1,变成了2,这时内部的n就指向2的地址了不会指向1,这时函数执行完毕,内部的n释放了,所以在最后输出n = 1为全局名称空间里定义的n
2号题:函数操作不可哈希的数据类型的数据
lis = [1,2,3,4] def func(lis): lis += [1] func(lis) print(lis)
输出答案:[1,2,3,4,1]
分析:又没有似曾相识的感觉,除了数据类型改变了其余的几乎没有改变,程序从上至下运行首先将lis变量加载进全局名称空间,随后遇到func(lis)执行函数将lis充当一个参数传入,这时产生一个临时的局部名称空间来装函数内部定义的变量与值的对应关系,随后在函数内部空间有创建了一个lis变量,这里我们称为内部的lis,并执行lis = lis赋值操作,将全局的lis赋值给了内部的lis,其后的操作都是对内部的lis进行操作对外部的lis没有任何关系,这时,内部的lis和全局lis都指向的是列表[1,2,3,4]的内存地址,但是这个地方要注意,他们指向的是列表的内存,而不是值的,那么也就是说,举例:小时候都有被取小名的经历,所以很大一部分人都有大名和小名,同理这时的全局lis就是这个列表的大名,而内部的lis是这个列表的小名,但是无论怎么样,他们两都是指的这个列表,所以都可以对这个列表进行操作,所以两个变量都可以对列表进行增删改查。所以内部的lis对列表进行修改后,在外部输出这个列表是改变后的样子。