Python——函數入門(三)

1、變量做用域

當程序定義一個變量時,這個變量是有它的做用範圍的,變量的做用範圍稱爲變量的做用域。根據變量的位置,分爲兩種:python

  • 局部變量:局部變量就是在函數中定義的變量,包括參數,都是局部變量,局部離開函數後,將不能被訪問。
  • 全局變量:不在函數內定義、全局範圍內定義的變量,都是全局變量,全局變量能夠在全部函數中被訪問。

在Python中,提供了三個工具函數獲取指定範圍內變量和值組成的字典。函數

  • globals():返回當前做用域全局變量的字典;不管在哪裏使用,都會獲取全局變量。
  • locals():返回包含當前範圍的局部變量的字典;當在全局範圍內使用,會獲取全局範圍內全部變量組成的字典。
  • vars():當沒有參數時,至關於locals();有一個參數時,至關於object.__dict__。

使用globals()和locals()獲取全局變量時,不該該被修改,修改會改變全局變量自己。而locals()獲取局部變量時,即便修改了,也不會對局部變量產生影響。工具

globals(),例:ui

a = 1
def test():
	b = 2
	print (globals())
test() # 打印全局變量 {'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <class '_frozen_importlib.BuiltinImporter'>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, 'a': 1, 'test': <function test at 0x0000000002EAC1E0>} globals() # 打印全局變量 {'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <class '_frozen_importlib.BuiltinImporter'>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, 'a': 1, 'test': <function test at 0x0000000002EAC1E0>}

locals(),例:blog

a = 1
def test():
	b = 2
	print (locals())

test()
# 打印局部變量 {'b': 2}

print (locals())
# 打印全局變量 {'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <class '_frozen_importlib.BuiltinImporter'>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, 'a': 1, 'test': <function test at 0x0000000002EAC1E0>}  

vars(),例:作用域

class test01:
	k1 = 1
	def test02():
		k2 = 2
		print (vars())
k3 = 3

test01.test02()
# 打印test02()的局部變量 {'k2': 2}

print (vars())
# 打印全局變量 {'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <class '_frozen_importlib.BuiltinImporter'>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, 'test01': <class '__main__.test01'>, 'k3': 3}

print (vars(test01))
# 打印類的屬性 {'__module__': '__main__', 'k1': 1, 'test02': <function test01.test02 at 0x00000000023892F0>, '__dict__': <attribute '__dict__' of 'test01' objects>, '__weakref__': <attribute '__weakref__' of 'test01' objects>, '__doc__': None}

print (test01.__dict__)
# 打印類的屬性 {'__module__': '__main__', 'k1': 1, 'test02': <function test01.test02 at 0x00000000023892F0>, '__dict__': <attribute '__dict__' of 'test01' objects>, '__weakref__': <attribute '__weakref__' of 'test01' objects>, '__doc__': None}

 

全局變量雖然能夠被全部函數訪問,可是若是在函數內定義了與全局變量同名的變量,就會發生局部變量遮蔽全局變量的狀況,例:io

a = 1
def test():
	print (a)

test()
# 運行成功,打印 1


def test02():
	a = 2
	print (a)

test02()
# 函數內部對不存在的變量賦值,會從新定義新的局部變量,打印 2


def test03():
	print (a)
	a = 3

test03()
# 報錯UnboundLocalError: local variable 'a' referenced before assignment,因爲a=3這段代碼從新定義了局部變量,因此a全局變量被被遮蔽。

 

2、使用global語句在函數中聲明全局變量 

爲了不在函數中對全局變量賦值,能夠經過global語句聲明全局變量。function

例:class

a = 1
def test():
  # 聲明a是全局變量,後面的語句將不會從新定義局部變量
  global a
  print (a)	# 打印 1
  # 對全局變量進行賦值    
  a = 2

test()
# 打印 1

print (a)
# 打印 2 
相關文章
相關標籤/搜索