Python學習筆記(五)——全局變量、變量、global、nonlocal

在Python中定義變量時,不需要指定變量的數據類型,系統會根據等號右邊的值,自動判斷出數據類型。
變量包括:

  • 全局變量
  • 局部變量

1. 全局變量

  • 全局變量是在函數外部定義的變量,所有函數內部都可以使用這個變量。
  • 當程序執行結束之後,全局變量會被系統收回。
  • 應該把模塊中所有的全局變量定義在所有函數的上方,就可以保證所有的函數都能夠正常的訪問到每一個全局變量了。

2. 局部變量

  • 局部變量是在函數內部定義的變量,只能在函數內部使用。
  • 函數執行結束後,函數內部的局部變量會被系統回收。
  • 注意: 當全局變量和局部變量的名字相同時,則局部變量的名字會變成灰色。
局部變量的生命週期
  • 就是變量從被創建到被系統回收的過程。
  • 局部變量在函數執行時纔會被系統創建
  • 函數執行結束後局部變量會被系統收回
  • 局部變量在生命內,可以用來存儲函數內部臨時使用到的數據。

3. 全局變量與局部變量的代碼演示

示例一:

total = 0    # 這是一個全局變量
def sum( arg1, arg2 ):
    #返回2個參數的和.
	total = arg1 + arg2   # total在這裏是局部變量.
 	print ("函數內是局部變量 : ", total)
	return total

	#調用sum函數
	sum( 10, 20 )
	print ("函數外是全局變量 : ", total)
	
	結果爲:
	函數內是局部變量 :  30
	函數外是全局變量 :  0

注意 1:函數執行時

  • 首先查找函數內部是否存在指定名稱的局部變量,如果有,直接使用
  • 如果沒有,查找函數外部是否存在指定名稱的全局變量,如果有,直接使用
  • 如果還沒有,程序報錯。

注意 2:

  • 不允許直接修改全局變量的引用即使用賦值語句修改全局變量的值。

代碼演示一:

num = 1
def test1():
    '''在Python中不允許修改全局變量的值,
    如果使用賦值語句,會在函數內部,定義一個局部變量。'''
    num = 100
    print("此時num的值爲:%d" % num)

def test2():
    print("此時num的值爲:%d" % num)

test1()
test2()
結果:
此時num的值爲:100
此時num的值爲:1

代碼演示二:對函數內部的變量進行賦值,不會改變全局變量的值

def demo(num):
    print("函數內部的代碼")
	#在函數內部,針對參數使用賦值語句,不會修改到外部的實參變量。
    num = 100
    num_list = [1,2,3]
    print(num)
    print(num_list)
    print("函數執行完成")

gl_num = 99
gl_list = [4,5,6]
demo(gl_num)
print(gl_num)
print(gl_list)

結果爲:
函數內部的代碼
100
[1, 2, 3]
函數執行完成
99
[4, 5, 6]

代碼演示三:當使用方法改變局部變量時,全局變量的值會改變。

def demo(num_list):
    print("函數內部的代碼")
    num_list.append(8)
    print(num_list)
    print("函數執行完成")

gl_list = [1,2,3]
demo(gl_list)
print(gl_list)

函數內部的代碼
[1, 2, 3, 8]
函數執行完成
[1, 2, 3, 8]

4. 在函數內部修改全局變量的值

使用 global和nonlocal關鍵字

  1. 當內部作用域想修改外部作用域的變量時,就要用到global和nonlocal關鍵字。

代碼演示:

num = 1
def fun1():
	global num  # 需要使用 global 關鍵字聲明
	print(num) 
	num = 123
	print(num)
fun1()
print(num)
結果爲:
	1
	123
	123
  1. 如果要修改嵌套作用域(enclosing 作用域,外層非全局作用域)中的變量則需要 nonlocal 關鍵字,
    代碼演示:

     def outer():
     	num = 10
    		def inner():
         	nonlocal num   # nonlocal關鍵字聲明
         	num = 100
        	 	print(num)
     	inner()
     	print(num)
     outer()
     結果爲:
     	100
     	100
     
     	
     注意:錯誤示例
     a = 10
     def test():
     	a = a + 1
    	 	print(a)
     test()
    
    
     正確示例:
     a = 10
     def test(a):
     	a = a + 1
     	print(a)
     test(a)
     結果爲:11
    

5. 引用

在Python中變量和數據是分開存儲的,數據保存在內存中的一個位置。變量中保存着數據在內存中的地址。變量中記錄數據的地址,就是引用

id()函數是用來查看變量中保存數據所在的內存地址。

注意:
如果變量已經被定義,當給一個變量賦值的時候,本質上是修改了數據的引用。

  • 變量不再對之前的數據引用
  • 變量改爲對新賦值的數據引用
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章