1. 程式人生 > 程式設計 >python函式區域性變數、全域性變數、遞迴知識點總結

python函式區域性變數、全域性變數、遞迴知識點總結

函式區域性變數 全域性變數 及其作用域

#簡單型別(int str等)變數的區域性變數與全域性變數及其作用域的關係
name = "xxx" #第一級頂頭定義的變數都稱為全域性變數,其作用域從變數定義的位置開始到此程式結束
def Print_Name():
  print("name before change:",name)
#由於name在此函式之前已經被定義為全域性變數,此處函式讀取變數name是讀取的全域性變數name “xxx”,函式內部就不能再定義其同名區域性變數,否則無法區分變數為區域性變數還是全域性變數
#  name = "yyy" #此語句放開以後會報錯:IndentationError: unindent does not match any outer indentation level
Print_Name()

def Change_Name():
  name = "yyy" #函式內部首先定義全域性變數的同名區域性變數,則整個函式內部操作的為區域性變數(一個與全域性變數同名的臨時變數)
  print("name after change is",name)

Change_Name() # yyy實際輸出的是區域性變數的值
print("global name is",name) # xxx此處訪問的是全域性變數,因為此print語句不是在Change_Name內部。

#函式內部需要強制對全域性變數進行修改,使用global關鍵字
def Change_global_Name():
  global name
  print("name before change is :",name)
  name = "yyy"
Change_global_Name() # xxx 修改前的全域性變數
print("global name is :",name) # yyy此處由於函式內強制宣告name為global變數,整個函式內部可以對global進行操作

#複雜資料型別列表 集合 字典等複雜資料結構如果函式外部定義了函式裡面是可以不用global宣告也操作的是全域性變數,沒有區域性變數一說了
names = ['111','222','333']
def Change_Names():
  names[0] = "444"
  print("in function names :",names)
Change_Names() #in function names : ['444','333']
print("global names :",names) #in function names : ['444','333'] 對於複雜的資料型別,函式內直接操作全域性變數,不會再生成區域性變數

遞迴

#函式內部可以呼叫其它函式,如果函式在內部呼叫自己就被稱為遞迴函式
def Half_fun(n):
  print(n)
  if n < 2:
    return n
  Half_fun(n/2)
Half_fun(100)
#遞迴特性:1、必須有一個明確的結束條件 2、每次遞迴呼叫問題複雜度需要相比上次簡化 3、遞迴會佔用大量記憶體

以上例項很簡單,大家可以本次測試下,感謝你的閱讀和對我們的支援。