python函数之--返回值和作用域

返回值

  • python函数使用return语句返回“返回值”
  • 所有函数都有返回值,如果没有return语句,隐式调用return None
  • 一个函数可以存在多个return语句,但是只有一条可以被执行。如果没有执行return,隐式调用return None
  • return语句不一定是函数语句块的最后一句,但一定是函数执行的最后一句
  • 如果有必要,可以显式调用return None,简写为return

作用域

一个标识符的可见的范围,就是这个标识符的作用域。一般常说的事变量的作用域

def foo():
	x = 100
print(x) #可以访问到么?

上述代码中的x不可以访问到,会抛出异常(NameError:name ‘x’ is not defind),原因在于函数是一个封装,它会开辟一个作用域,x变量被限制在这个作用域中,所以在函数外部x变量不可见。

Ps:每一个函数都会开辟一个作用域

作用域分类

  • 全局作用域
    • 在整个程序运行环境中都可见
    • 全局作用域中的变量称为全局变量
  • 局部作用域
    • 在函数、类等内部可见
    • 局部作用域中的变量称为局部变量,其使用范围不能超过其所在的局部作用域
#局部变量
def fn1():
	x = 100 #局部作用域,x为局部变量,适用范围在fn1内
def fn2():
	print(x) #无法访问x
print(x) #无法访问x
#全局变量
x = 100 #全局变量,也可在函数外定义
def fn3():
	print(x)#可以访问x
fn3()
  • 一般来说,外部作用域的变量在函数内部可见,可以使用
  • 反之,函数内部的局部变量不能被函数外部使用

一个赋值语句的问题

x = 10
def foo():
	print(x)
foo()#正常执行,函数外部的变量在函数内可见
x = 10
def foo():
	y = x + 1
foo()#正常执行,x取函数外部可见变量
x = 10
def foo():
	x = x + 1
foo()#此处报错!

python函数之--返回值和作用域

why???

原因分析

  • x += 1等价于 x = x + 1
  • 相当于在函数foo内部定义了一个局部变量x(赋值即重新定义!重点敲黑板,记下来!)
  • x = x + 1相当于定义了局部变量x,但是x还没有完成赋值,就被右边拿来做+1操作了,所以会报错

如何解决这一常见问题?

再此引入globle语句

x = 10
def foo():
	globle x
	x += 1
foo()#正常执行

def foo():
	globle x
	x = 10
	x += 1
foo()
print(x)#能读取x么?
  • 使用globle关键字定义的变量,虽然在foo中声明,但这是告诉当前foo函数的作用域,这个x的变量将使用外部全局作用域中的x;
  • 即使是在foo中又写了x=10,也不会在foo这个局部作用域中定义局部变量x了;

总结

  • x += 1这种特殊形式产生的错误原因?先引用后赋值,而python是动态语言是复制才算定义(赋值即定义!再次敲黑板),才能被引用。解决办法:在这条语句之前加一条x = 0之类的赋值语句,或使用globle关键字告诉foo函数,去全局作用域中找变量定义;

感冒难受,待更。。。