python-变量作用域

  • 变量作用域
    Pyhton 中,程序的变量并不是在哪个位置都可以访问的,访问权限决定于这个变量是在哪里赋值的。
    变量的作用域决定了在哪一部分程序可以访问哪个特定的变量名称。两种最基本的变量作用域如下:
  • 全局变量
  • 局部变量
  • 全局变量和局部变量-简介
    定义在函数内部的变量拥有一个局部作用域,定义在函数外的拥有全局作用域。
    局部变量只能在其被声明的函数内部访问,而全局变量可以在整个程序范围内访问。调用函数时,所有在函数内声明的变量名称都将被加入到作用域中。如下实例:
#!/usr/bin/python3
  	
  	total = 0; # 这是一个全局变量
  	# 可写函数说明
  	def sum( arg1, arg2 ):
  	    #返回2个参数的和."
  	    total = arg1 + arg2; # total在这里是局部变量.
  	    print ("函数内是局部变量 : ", total)
  	    return total;
  	
  	#调用sum函数
  	sum( 10, 20 );
  	print ("函数外是全局变量 : ", total)

以上实例输出结果:

函数内是局部变量 :  30
  	函数外是全局变量 :  0
  • 示例讲解
# ---------------------------
  # 在函数中对变量进行赋值操作则被视为内部局部变量
  # ---------------------------

  	num = 0

  	def var_func1():
  		num=1
  		print("num in var_func1 is %d" % num)
  	
  	var_func1()
  		>>> var_func1()
  		num in var_func1 is 1
  	
  	print("num is %d " % num)
  		>>> print("num is %d " % num)
  		num is 0 
  
  # ---------------------------
  # --num 被视为var_func2的内部局部变量, 但是调用是在定义之前
  # ---------------------------

  	num = 0
  	
  	def var_func2():
  	    print("num in var_func2 is %d" % num)
  	    num = 1
  	
  	try:
  	    var_func2()
  	except UnboundLocalError as e:
  	    print('Error is:', e.args)
  	
  	print("num is %d " % num)
  	
  	

  # ---------------------------
  # -- 数组 li 变量作用域
  # ---------------------------

  	li = [1, 2, 3]
  	
  	def foo():
  	    # 此处li是对应的全局变量, 而非内部局部变量
  	    li.append(4)
  	    print(li)
  	
  	foo()
  	
  	
  	def bar():
  		# 此处li被视为是内部局部变量(因为是赋值操作), 但是在执行li 追加的时候li并没有定义
  		li += [5]
  		print(li)
  	
  	try:
  		bar()
  	except UnboundLocalError as e:
  		print('Error is:', (e))
  	
  	
  	def bar1():
  		# 已显式全局变量的形式调用li变量
  		global li
  		li += [5]
  		print(li)
  	
  	bar1()
  	


  # ---------------------------
  # Python中的变量:全局变量和局部变量 - 示例
  # 在很多语言中,在声明全局变量的时候,都喜欢把全局变量的名称定义为大写
  # 定义学生人数为10000
  # ---------------------------

  	STUDENT_NUMBER = 10000
  	
  	# 学校名称
  	SCHOOL_NAME = 'HARBIN UNIVERSITY OF COMMERCE'
  	
  	# 获取全局变量:学生人数STUDENT_NUMBER的值
  	def getStudentNumber():
  	    return STUDENT_NUMBER
  	
  	# 重置全局变量:学生人数STUDENT_NUMBER值
  	def setStudentNumber(num):
  	    global STUDENT_NUMBER
  	    STUDENT_NUMBER = num
  	
  	# 获取全局变量:学校名称SCHOOL_NAME的值
  	def getSchoolName():
  	    return SCHOOL_NAME
  	
  	# 重置全局变量:学校名称SCHOOL_NAME值
  	def setSchoolName(name):
  	    global SCHOOL_NAME
  	    SCHOOL_NAME = name
  	
  	def changeValue():
  	    name = '哈尔滨商业大学'
  	    number = 88
  	    print('全局变量STUDENT_NUMBER = ', getStudentNumber())
  	    print('全局变量SCHOOL_NAME = ', getSchoolName())
  	    print('#######################################')
  	    print('局部变量number = ', number)
  	    print('局部变量name = ', name)
  	    print('#######################################')
  	    print('改变全局变量值...')
  	    print('#######################################')
  	    setStudentNumber(number)
  	    setSchoolName(name)
  	    print('全局变量STUDENT_NUMBER = ', getStudentNumber())
  	    print('全局变量SCHOOL_NAME = ', getSchoolName())
  	
  	if __name__ == '__main__':
  	    changeValue()