python函數變量的作用域聲明(全局變量和局部變量)


函數變量的作用域聲明(全局變量和局部變量)

引入問題:

 

 

 

 

局部變量:

局部變量:定義在函數內部的變量,它的作用域也僅限於函數內部,出了函數就不能使用了。

例如:

#encoding = utf-8

def demo():

    tips = "No Smoking"

    print("函數內部變量tips:",tips)

demo()

print ("函數外部變量tips:",tips) 

 

 

 

 可以看到,如果試圖在函數外部訪問其內部定義的變量,會報NameError的錯誤

全局變量

1、全局變量:定義在函數外部的變量,作用域是整個程序。即可以在函數外部使用,也可以在函數內部使用。

2、內部使用時,需要加global聲明為全局變量。

3、內部使用時,如果不想影響全局變量,那么就聲明為局部變量。

 

===========================================================================================

例如:

#encoding = utf-8

tips = "No Smoking"

def demo():

    print("函數內部變量tips:",tips)   #僅在函數內部引用全局變量

demo()

print ("函數外部變量tips:",tips)

 

 

 

 ============================================================================================

如果此時在函數內部對全局變量進行修改,會報錯如下:

#encoding = utf-8

tips = "No Smoking"

def demo():

    tips+="!"   #對全局變量進行修改

    print("函數內部變量tips:",tips)

demo()

print ("函數外部變量tips:",tips)

 

 

 

 原因:

python解釋器誤把tips當成了局部變量,而此時在函數內部又沒有對tips定義,所以報錯。如果內部作用域想要改變外部作用域的值,需要加global。

解決方法:

1) 在函數內部對tips變量進行全局聲明(使用global),這種方式會同步改變全局變量tips的值。

2) 定義一個局部變量,用來存儲修改后的值。tips只在函數內部被修改了。

3) 在函數中定義一個與全局變量一樣的tips。tips也只會在函數內部被修改。

 

#修改方式1:

#encoding = utf-8

tips = "No Smoking"

def demo():

    global tips   #使用global

    tips+="!"

    print("函數內部變量tips:",tips)

demo()

print ("函數外部變量tips:",tips)

 

 

  

修改方式2:

#encoding = utf-8

tips = "No Smoking"

def demo():

    new_tips = tips + "!"  #修改tips后的值 賦給新的變量

    print("函數內部變量new_tips:",new_tips)

demo()

print ("函數外部變量tips:",tips)

 

 

 

 

修改方式3:

#encoding = utf-8

tips = "No Smoking"

def demo():

    tips="No Smoking"    #聲明為局部變量

    tips+="!"

    print("函數內部變量tips:",tips)

demo()

print ("函數外部變量tips:",tips)

 

 

 

 ==========================================================================================

再看一個例子:

List = [1,2,3]

String = "hello"

def demo():

    String = "hi"

    List[0] = "*"

    print("函數內部變量List:",List)

    print("函數內部變量String:",String)

demo()

print("函數外部變量List:",List)

print("函數外部變量String:",String)

 

 

 

 

 疑問:為什么定義了一個全局變量列表,函數內部對其進行修改時,不加global也不會報錯?

原因:

1) 對於函數內String = "hello",它是“有歧義的”,因為它既可以是表示引用全局變量String,也可以是創建一個新的局部變量,所以在python中,默認它的行為是創建局部變量,除非顯式聲明global。

2) 而對於函數內的List[0] = "*",它是“明確的”,因為如果把List當作是局部變量的話,它會報NameError,所以它只能是引用全局的List,故不需要多此一舉顯式聲明global。

3) 而如果函數內的List變量寫成 List=["*"],那么List也會變成局部變量

4) 仔細想想,就會發現不止list不需要global,所有”明確的“東西都不需要global。因為int類型str類型之類的,只有一種修改方法,即x = y, 恰好這種修改方法同時也是創建變量的方法,所以產生了歧義,不知道是要修改還是創建。而dict/list/對象等,可以通過dict['x']=y或list.append()之類的來修改,跟創建變量不沖突,不產生歧義,所以都不用顯式global

 

因此解決了最開始的,為什么字符串要在函數內部聲明為全局變量,而列表不用的問題。

 

小結:

1)引用全局變量,不需要golbal聲明

2)修改全局變量,需要使用global聲明,

3)特別地,列表、字典等可變類型如果只是修改其中元素的值,可以直接使用全局變量,不需要global聲明。

建議:

1) 如果函數內想用外部的全局變量,那么就寫成global

2) 如果不想用外部的全局變量,那么就在函數內對變量做初始化(即聲明局部變量)。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM