一、局部變量
局部變量也稱為內部(函數內部)變量。局部變量是在函數內作定義說明的。其作用域僅限於函數內, 離開該函數后再使用這種變量是非法的。對於整個程序而言,局部變量僅在其定義的函數內部起作用,因此稱為局部變量。其作用域是所定義的函數內部,從它們的名稱被定義的那一點開始。
下面來舉例說明局部變量的使用及其需要注意的地方。
1、
1 def func1(): 2 a=100 3 print("a的值為:%s"%a) 4 def func2(): 5 b=100 6 b+=100 7 print("b的值為:%s"%b) 8 9 func1() 10 func2()
上面的變量a和b都是局部變量,其中a的作用域是函數func1(),b的作用域是函數func2()。如果在func1()中調用b,或者在func2中調用a,都會出現NameError: name 'b' is not defined這樣的錯誤。
局部變量的小結:
1、局部變量,就是在函數內部定義的變量
2、不同的函數,可以定義相同的名字的局部變量,但是各用個的不會產生影響
3、局部變量的作用,為了臨時保存數據需要在函數中定義變量來進行存儲,這就是它的作用
二、全局變量
全局變量也稱為外部變量,它是在函數外部定義的變量。 它不屬於哪一個函數,它屬於一個源程序文件。其作用域是整個源程序。在函數中使用全局變量,一般應作全局變量說明。 只有在函數內經過說明的全局變量才能使用。 但在一個函數之前定義的全局變量,在該函數內使用可不再加以說明。
下面來舉例說明。
1、
1 c=100 2 def func3(): 3 print("c的值為:%s"%c) 4 d=200 5 sum=c+d 6 print("sum的值為:%s"%sum) 7 def func4(): 8 print("c的值為:%s"%c) 9 square=c**2 10 print("square等於:%s"%square) 11 12 func3() 13 func4()
輸出結果為:
1 c的值為:100 2 sum的值為:300 3 c的值為:100 4 square等於:10000 5 [Finished in 0.2s]
上面例子中的c就是一個全局變量。變量c在函數外部定義,在同一程序中可以被所有函數使用。在全局變量c定義之后的函數都可以直接調用,不需附加任何代碼。所以全局變量一般定義在函數的前面。
2、全局變量和局部變量名字相同的問題
1 a=400#全局變量,可以在后面的代碼中使用。 2 def test1(): 3 a=200#局部變量只能在該函數中使用(它的作用范圍在該函數里面) 4 5 a+=1 6 print("a的值為%s"%a) 7 return a 8 9 def test2(a): 10 #a=300#如果函數的局部變量和全局變量的名字一樣,優先使用局部變量 11 12 print("test2函數中a的值為:%s"%a) 13 b = test1() 14 15 test2(b) 16 print(a)
輸出結果為:
1 a的值為201 2 test2函數中a的值為:201 3 400 4 [Finished in 0.2s]
仔細看看上面的例子。
3、修改全局變量
既然全局變量可以在函數中被使用,那么如何修改全局變量呢?
答案是使用:global
舉例如下:
1 student={"name":"laowang"} 2 a="laogao" 3 b=100 4 #在函數中修改全局變量:1、如果是可變類型可以執行修改變量的值,2、如果全局變量是不可變類型,如果想要在函數中修改不可變類型,
其實本質上是修改不可變類型的全局變量的引用,加上global 就可以修改不可變變量的引用。 5 def test1(): 6 print("原始的全局變量為:%s"%names) 7 names[2]="laoxiao" 8 student["age"]=23 9 #a="golbin"#定義一個局部變量 10 global a 11 a="golbin"#修改全局變量 12 global b 13 b+=1 14 names=["laowang","lisi",'zhangsan']#全局變量定義在調用函數之前 15 test1() 16 print("最后的全局變量為:%s"%names) 17 print("最后的全局變量為student:%s"%student) 18 print("最后的全局變量a的值為:%s"%a) 19 print("最后的全局變量b的值為:%s"%b)
輸出結果為:
1 原始的全局變量為:['laowang', 'lisi', 'zhangsan'] 2 最后的全局變量為:['laowang', 'lisi', 'laoxiao'] 3 最后的全局變量為student:{'name': 'laowang', 'age': 23} 4 最后的全局變量a的值為:golbin 5 最后的全局變量b的值為:101 6 [Finished in 0.2s]
注意:在函數中修改全局變量:
1、如果是可變類型可以執行修改變量的值,
2、如果全局變量是不可變類型,如果想要在函數中修改不可變類型,其實本質上是修改不可變類型的全局變量的引用,加上global 就可以修改不可變變量的引用。
到此,對於全局變量做一個小結:
A、在函數外邊定義的變量叫做全局變量
B、全局變量能夠在所有的函數中進行訪問
C、如果在函數中修改全局變量,那么就需要使用global進行聲明,否則出錯
D、如果全局變量的名字和局部變量的名字相同,那么使用的是局部變量的,小技巧強龍不壓地頭蛇
以上就是關於全局變量和局部變量的所有問題以及需要注意的點。在這里我們在做一個總結。
-
在函數中不使用global聲明全局變量時不能修改全局變量的本質是不能修改全局變量的指向,即不能將全局變量指向新的數據。
-
對於不可變類型的全局變量來說,因其指向的數據不能修改,所以不使用global時無法修改全局變量。
-
對於可變類型的全局變量來說,因其指向的數據可以修改,所以不使用global時也可修改全局變量。
可變類型:值可以修改(內存地址不變但是所保存的值變化了),引用可以修改(變量的內存地址變化了)
不可變類型:值不可以修改,可以修改變量的引用(=賦值號)。
在函數里面修改全局變量:
1、如果全局變量是可變類型:所以在函數里面任意修改(值,引用)
2、如果全局變量是不可變類型:在函數里面不能修改值,也不能修改引用,除非加上global 才能修改引用。
思考:全局變量可以放在哪里?
全局變量放在調用函數之前。
