在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關鍵字
- 當內部作用域想修改外部作用域的變量時,就要用到global和nonlocal關鍵字。
代碼演示:
num = 1
def fun1():
global num # 需要使用 global 關鍵字聲明
print(num)
num = 123
print(num)
fun1()
print(num)
結果爲:
1
123
123
-
如果要修改嵌套作用域(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()函數是用來查看變量中保存數據所在的內存地址。
注意:
如果變量已經被定義,當給一個變量賦值的時候,本質上是修改了數據的引用。
- 變量不再對之前的數據引用
- 變量改爲對新賦值的數據引用