1. 程式人生 > 程式設計 >Python基礎之變數基本用法與進階詳解

Python基礎之變數基本用法與進階詳解

本文例項講述了Python基礎之變數基本用法與進階。分享給大家供大家參考,具體如下:

目標

  • 變數的引用
  • 可變和不可變型別
  • 區域性變數和全域性變數

01. 變數的引用

  • 變數 和 資料 都是儲存在 記憶體 中的
  • 在 Python 中 函式 的 引數傳遞 以及 返回值 都是靠 引用 傳遞的

1.1 引用的概念

在 Python 中

  • 變數 和 資料 是分開儲存的
  • 資料 儲存在記憶體中的一個位置
  • 變數 中儲存著資料在記憶體中的地址
  • 變數 中 記錄資料的地址,就叫做 引用
  • 使用 id() 函式可以檢視變數中儲存資料所在的 記憶體地址

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

  • 變數 不再 對之前的資料引用
  • 變數 改為 對新賦值的資料引用

1.2 變數引用 的示例

在 Python 中,變數的名字類似於 便籤紙 貼在 資料 上

  • 定義一個整數變數 a,並且賦值為 1
    在這裡插入圖片描述
    將變數 a 賦值為 2
    在這裡插入圖片描述
    定義一個整數變數 b,並且將變數 a 的值賦值給 b
    在這裡插入圖片描述
    變數 b 是第 2 個貼在數字 2 上的標籤

1.3 函式的引數和返回值的傳遞

在 Python 中,函式的 實參/返回值 都是是靠 引用 來傳遞來的

def test(num):

  print("-" * 50)
  print("%d 在函式內的記憶體地址是 %x" % (num,id(num)))

  result = 100

  print("返回值 %d 在記憶體中的地址是 %x" % (result,id(result)))
  print("-" * 50)

  return result

a = 10
print("呼叫函式前 記憶體地址是 %x" % id(a))

r = test(a)

print("呼叫函式後 實參記憶體地址是 %x" % id(a))
print("呼叫函式後 返回值記憶體地址是 %x" % id(r))

02. 可變和不可變型別

  • 不可變型別,記憶體中的資料不允許被修改:
    • 數字型別 int,bool,float,complex,long(2.x)
    • 字串 str
    • 元組 tuple
  • 可變型別,記憶體中的資料可以被修改:
    • 列表 list
    • 字典 dict
a = 1
a = "hello"
a = [1,2,3]
a = [3,1]
demo_list = [1,3]

print("定義列表後的記憶體地址 %d" % id(demo_list))

demo_list.append(999)
demo_list.pop(0)
demo_list.remove(2)
demo_list[0] = 10

print("修改資料後的記憶體地址 %d" % id(demo_list))

demo_dict = {"name": "小明"}

print("定義字典後的記憶體地址 %d" % id(demo_dict))

demo_dict["age"] = 18
demo_dict.pop("name")
demo_dict["name"] = "老王"

print("修改資料後的記憶體地址 %d" % id(demo_dict))

注意:字典的 key 只能使用不可變型別的資料

注意

  1. 可變型別的資料變化,是通過 方法 來實現的
  2. 如果給一個可變型別的變數,賦值了一個新的資料,引用會修改
    • 變數 不再 對之前的資料引用
    • 變數 改為 對新賦值的資料引用

雜湊 (hash)

  • Python 中內建有一個名字叫做 hash(o) 的函式
    • 接收一個 不可變型別 的資料作為 引數
    • 返回 結果是一個 整數
  • 雜湊 是一種 演算法,其作用就是提取資料的 特徵碼(指紋)
    • 相同的內容 得到 相同的結果
    • 不同的內容 得到 不同的結果
  • 在 Python 中,設定字典的 鍵值對 時,會首先對 key 進行 hash 已決定如何在記憶體中儲存字典的資料,以方便 後續 對字典的操作:增、刪、改、查
    • 鍵值對的 key 必須是不可變型別資料
    • 鍵值對的 value 可以是任意型別的資料

03. 區域性變數和全域性變數

  • 區域性變數 是在 函式內部 定義的變數,只能在函式內部使用
  • 全域性變數 是在 函式外部定義 的變數(沒有定義在某一個函式內),所有函式 內部 都可以使用這個變數

提示:在其他的開發語言中,大多 不推薦使用全域性變數 —— 可變範圍太大,導致程式不好維護!

3.1 區域性變數

  • 區域性變數 是在 函式內部 定義的變數,只能在函式內部使用
  • 函式執行結束後,函式內部的區域性變數,會被系統回收
  • 不同的函式,可以定義相同的名字的區域性變數,但是 彼此之間 不會產生影響

區域性變數的作用

  • 在函式內部使用,臨時 儲存 函式內部需要使用的資料
def demo1():

  num = 10

  print(num)

  num = 20

  print("修改後 %d" % num)


def demo2():

  num = 100

  print(num)

demo1()
demo2()

print("over")

區域性變數的生命週期

  • 所謂 生命週期 就是變數從 被建立 到 被系統回收 的過程
  • 區域性變數 在 函式執行時 才會被建立
  • 函式執行結束後 區域性變數 被系統回收
  • 區域性變數在生命週期 內,可以用來儲存 函式內部臨時使用到的資料

3.2 全域性變數

  • 全域性變數 是在 函式外部定義 的變數,所有函式內部都可以使用這個變數
# 定義一個全域性變數
num = 10


def demo1():

  print(num)


def demo2():

  print(num)

demo1()
demo2()

print("over")

注意:函式執行時,需要處理變數時 會:

  1. 首先 查詢 函式內部 是否存在 指定名稱 的區域性變數,如果有,直接使用
  2. 如果沒有,查詢 函式外部 是否存在 指定名稱 的全域性變數,如果有,直接使用
  3. 如果還沒有,程式報錯!

1) 函式不能直接修改 全域性變數的引用

  • 全域性變數 是在 函式外部定義 的變數(沒有定義在某一個函式內),所有函式 內部 都可以使用這個變數

提示:在其他的開發語言中,大多 不推薦使用全域性變數 —— 可變範圍太大,導致程式不好維護!

  • 在函式內部,可以 通過全域性變數的引用獲取對應的資料
  • 但是,不允許直接修改全域性變數的引用 —— 使用賦值語句修改全域性變數的值
num = 10


def demo1():

  print("demo1" + "-" * 50)

  # 只是定義了一個區域性變數,不會修改到全域性變數,只是變數名相同而已
  num = 100
  print(num)


def demo2():

  print("demo2" + "-" * 50)
  print(num)

demo1()
demo2()

print("over")

注意:只是在函式內部定義了一個區域性變數而已,只是變數名相同 —— 在函式內部不能直接修改全域性變數的值

2) 在函式內部修改全域性變數的值

  • 如果在函式中需要修改全域性變數,需要使用 global 進行宣告
num = 10


def demo1():

  print("demo1" + "-" * 50)

  # global 關鍵字,告訴 Python 直譯器 num 是一個全域性變數
  global num
  # 只是定義了一個區域性變數,不會修改到全域性變數,只是變數名相同而已
  num = 100
  print(num)


def demo2():

  print("demo2" + "-" * 50)
  print(num)

demo1()
demo2()

print("over")

3) 全域性變數定義的位置

  • 為了保證所有的函式都能夠正確使用到全域性變數,應該 將全域性變數定義在其他函式的上方
a = 10


def demo():
  print("%d" % a)
  print("%d" % b)
  print("%d" % c)

b = 20
demo()
c = 30

注意

  • 由於全域性變數 c,是在呼叫函式之後,才定義的,在執行函式時,變數還沒有定義,所以程式會報錯!

程式碼結構示意圖如下
在這裡插入圖片描述
4) 全域性變數命名的建議

  • 為了避免區域性變數和全域性變量出現混淆,在定義全域性變數時,有些公司會有一些開發要求,例如:
  • 全域性變數名前應該增加 g_ 或者 gl_ 的字首

提示:具體的要求格式,各公司要求可能會有些差異

關於Python相關內容感興趣的讀者可檢視本站專題:《Python函式使用技巧總結》、《Python面向物件程式設計入門與進階教程》、《Python資料結構與演算法教程》、《Python字串操作技巧彙總》、《Python編碼操作技巧總結》及《Python入門與進階經典教程》

希望本文所述對大家Python程式設計有所幫助。