變量進階

目標

變量的應用算法

可變和不可變類型函數

局部變量和全局變量spa

 

01.變量的應用

變量和數據都是保存在內存中的code

在Python中函數的參數傳遞以及返回值都是靠引用傳遞的blog

1.1引用的概念

在Python中生命週期

  變量和數據是分開存儲的內存

  數據保存在內存中的一個位置開發

  變量中保存着數據在內存中的地址字符串

  變量中記錄數據的地址,就叫作引用pycharm

 注意:若是變量已經被定義,當給一個變量賦值的時候,本質上是修改了數據的應用

  變量再也不對以前的數據引用

  變量改成對新賦值的數據引用

1.3 函數的參數和返回值的傳遞

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

# 函數實參的引用傳遞
def
test(num): print("在函數內部 %d 對應的內存地址是 %d" % (num,id(num))) # 1.定義一個數字的變量 a = 10 # 數據的地址本質上就是一個數字 print("a 變量保存數據的內存地址是 %d" % id(a)) # 2.調用test函數 本質上傳遞的是實參保存數據的引用,而不是實參保存的數據 test(a)

函數返回值的傳遞

def test(num):

    print("在函數內部 %d 對應的內存地址是 %d" % (num,id(num)))
    # 1> 定義一個字符串變量
    result = "hello"
    print("函數要返回數據的內存地址是 %d" % id(result))
    # 2> 將字符串變量返回,返回的是數據的引用,而不是數據自己
    return  result
# 1.定義一個數字的變量
a = 10
# 數據的地址本質上就是一個數字
print("a 變量保存數據的內存地址是 %d" % id(a))
# 2.調用test函數 本質上傳遞的是實參保存數據的引用,而不是實參保存的數據
# 注意:若是函數有返回值,可是沒有定義變量接收
# 程序不會報錯,可是沒法得到返回結果
r = test(a)
print("%s 的內存地址是 %d" % (r,id(r)))

 

02.可變和不可變類型

不可變類型,內存中的數據不容許被修改:

  數字類型 int,bool,float,complex,long(2,x)

  字符串 str

  元組 tuple

可變類型,內存中的數據能夠被修改:

  列表 list

  字典 dict

  注意:字典的key只能使用不可變類型的數據

注意:

  1.可變類型的數據變化,是經過方法來實現的

  2.若是給一個可變類型的變量,賦值了一個新的數據,引用會修改

    變量再也不對以前的數據引用

    變量改成對新賦值的數據引用

 

哈希(hash)

Python中內置有一個名字叫作 hash(o)的函數

  接收一個不可變類型的數據做爲參數

  返回結果是一個整數

哈希 是一種算法,其做用就是提取數據的特徵碼(相似指紋)

  相同的內容獲得相同的結果

  不一樣的內容獲得不一樣的結果

在Python中,設置字典的鍵值對時,會首先對key進行hash已決定如何在內存中保存字典的數據,以方便後續對字典的操做:增、刪、改、查

  鍵值對的key必須是不可變類型數據

  鍵值對的value能夠是任意類型的數據

 

 

03.局部變量和全局變量

局部變量是在函數內部定義的變量,只能在函數內部使用

全局變量是在函數外部定義的變量(沒有定義在某一個函數內),全部函數內部均可以使用這個變量

  提示:在其餘的開發語言中,大多不推薦使用全局變量——可變範圍太大,致使程序很差維護!

3.1 局部變量

局部變量是在函數內部定義的變量,只能在函數內部使用

函數執行結束後函數內部的局部變量會被系統回收

不一樣的函數能夠定義相同的名字的局部變量,可是各用個的不會產生影響

局部變量的做用

  在函數內部使用,臨時保存函數內部須要使用的數據

def demo1():
    # 定義一個局部變量
    num = 10
    print("在demo1函數內部的變量是 %d" % num)

def demo2():
    # print("%d" % num)    函數內部定義的變量不能在另外一個函數內使用
    pass
# 在函數內部定義的變量,不能再其餘位置使用 
# print("%d" % num)   函數內部定義的變量不能在函數外部使用
demo1()
demo2()

局部變量的生命週期

# 所謂 生命週期 就是變量從被建立到被系統回收的過程
# 局部變量 在函數執行時纔會被建立
# 函數執行結束後 函數變量 被系統回收
# 局部變量在生命週期內,能夠用來存儲函數內部臨時使用到的數據

# 1> 出生:執行了下方代碼以後,變量纔會被建立
# 2> 死亡:函數執行完成以後,變量會被系統回

3.2 全局變量

全局變量是在函數外部定義的變量,全部的函數內部均可以使用這個變量

# 全局變量
num = 10

def demo1():
    print("demo1 ==> %d" % num)

def demo2():
    print("demo2 ==> %d" % num)

demo1()
demo2()

注意:函數執行時,須要處理變量時會:

1.首先查找函數內部時候存在指定名稱的局部變量,若是有,直接使用

2.若是沒有,查找函數外部是否存在指定名稱的全局變量,若是有,直接使用

3.若是尚未,程序報錯!

1)函數不能直接修改全局變量的引用

全局變量是在函數外部定義的變量(沒有定義在某一個函數內),全部函數內部均可以使用這個變量

提示:在其餘開發語言中,大多不推薦使用全局變量——可變範圍太大,致使程序很差維護

在函數內部,能夠經過全局變量的引用獲取對應的數據

可是,不容許直接修改全局變量的引用——使用賦值語句修改全局變量的值

# 全局變量
num = 10

def demo1():
    # 但願修改全局變量的值
    # 在Python中,不容許直接修改全局變量的值
    # 若是使用賦值語句,會在函數內部,定義一個局部變量
    num = 99
    print("demo1 ==> %d" % num)

def demo2():
    print("demo2 ==> %d" % num)

demo1()
demo2()
# 注意:只有在函數內部定義了一個函數變量而已,只是變量名相同——在函數內部不能直接修改全局變量的值

 

2)在函數內部修改全局變量的值

若是在函數中須要修改全局變量,須要使用global進行聲明

# 修改全局變量
num = 10

def demo1():
    # 但願修改全局變量的值 ——使用global聲明一下變量便可
    # 當下面的函數調用到全局變量時,調用的就是在這個函數中修改後的值
    global num
    num = 99
    print("demo1 ==> %d" % num)

def demo2():
    print("demo2 ==> %d" % num)

demo1()
demo2()

 

3)全局變量定義的位置

爲了保證全部的函數都可以正確使用到全局變量,應該將全局變量定義在其餘函數的上方

# 注意:在開發時,應該把模塊中的全部全局變量
# 定義在全部函數上方,就能夠保證全部的函數
# 都可以正常的訪問到每一個全局變量了
num = 10

def demo():
    print("%d" % num)
    print("%s" % title)
    # print("%s" % name)

# 在定義一個全局變量
title = "hmcxy"

demo()
# 再定義一個全局變量
# name = "xiaoming"  由於該全局變量定義在函數下方,
# 致使系統再未定義該變量以前就運行到了函數demo

注意:若是全局變量在調用函數以後才定義,在執行函數時,變量尚未定義,因此程序會報錯

4)全局變量命名的建議

爲了不局部變量和全局變量出現混淆,在定義全局變量時,有些公司會有一些開發要求,例如:

全局變量名前應該增長g_或者gl_的前綴

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

gl_num = 10
# 在定義一個全局變量
gl_title = "小明"
# 再定義一個全局變量
gl_name = "小王"
def demo():
    # 若是局部變量的名字和全局變量的名字相同
    # pycharm會在局部變量下方顯示一個波浪線 提示可能會產生混淆
    num = 99
    print("%d" % num)
    print("%s" % gl_title)
    print("%s" % gl_name)
    
demo()

 

當程序中多個相同變量名須要修改時,能夠將鼠標防止到須要修改的變量名上,右鍵  refactor  rename

相關文章
相關標籤/搜索