Python自学笔记---7.Python函数的一些细节

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/DataCow/article/details/81193833

1.参数传递与返回值

调用函数时,函数参数仅仅是指代传入对象的名称。参数传递的基本语义和其他编程语言中已知的方式不完全相同,如“按值传递”或“按引用传递”。如果传递不可变的值,参数看起来实际是按值传递。但如果传递可变的对象(列表或者字典)给函数,然后再修改此可变对象,这些改动将反映在原始对象中。如下例:

a = [1, 2, 3, 4, 5]
def square(item):
    for i,x in enumerate(item):
        item[i] = x * x

square(a)
print(a)

最后打印的结果为:

[1, 4, 9, 16, 25] #可以看到a的值已经被改变

像上述例子中的代码量很小,这种函数带来的 副作用 不是特别明显,但是当代码量超过上千行,或者在多线程,多进程中操作这样的代码,如果出现bug,其调试将会是一种痛不欲生的体验(自己做实验和在工作中debug是两种完全不同的心态)。

2.作用域规则

系统每次执行一个函数时,就会创建新的局部命名空间。该命名空间代表一个局部环境,其中包含 函数参数的名称 和在 函数体内赋值的变量名称。解析这些名称时,解释器将首先搜索局部命名空间。如果没有找到匹配的名称,他就会搜索全局命名空间。
函数的全局命名空间始终是定义该函数的模块如果解释器在全局命名空间中也找不到匹配值,最终会检查内置命名空间。如果仍然找不到,就会引起NameError错误。
我们来看下面一段实例

a = 66
def fun()a = 13
fun()
print(a) #这个实验自己动手打印一下结果

尽管我们在fun函数中对a的值做了改变,但实际的打印结果仍是 66 。当变量在函数中被赋值时,这些变量始终被绑定到该函数的局部命名空间中,因此函数体中的变量a引用的是一个包含值13 的全新对象,而不是外部变量。
待用global语句可以改变这种行为。global语句明确的将变量名称声明为属于全局命名空间,只有在需要修改全局变量时才必须使用他。这条语句可以出现在函数体中的任意位置,并且可以重复使用。如下例

a = 66
def  fun():
   global a
   a = 13
fun()
print(a) 

总结

  • 本节首先讨论了在函数参数传递过程中 按值传递和按引用传递的情况,针对这种情况给出了一个小实验,并且预警了在使用过程中可能存在的风险
  • 第二节讨论了变量的作用域规则,明确了我们在引用全局变量时需要注意使用global这个语句。

猜你喜欢

转载自blog.csdn.net/DataCow/article/details/81193833