1. 程式人生 > >Python學習之路-----變數的引用

Python學習之路-----變數的引用

基本資料型別的引用

        在Python中定義一個數據便在記憶體中開闢一片空間來儲存這個變數的值,這塊已經被分配的記憶體空間便會有一個記憶體地址。訪問這塊記憶體需要用到變數名,變數名實際儲存的是變數的地址在記憶體中的地址,但是使用print()函式得到的確實這塊記憶體中實際的地址。這個就當成規定就好,沒必要糾結。

        獲得變數在記憶體中的地址,可以使用id()函式。

常規使用

        變數之間的賦值其實是把一個變數的記憶體地址傳遞給另一個變數,這樣兩個變數便都指向記憶體中的同一塊空間,因此這兩個變數的之是相等的。

a = 1
b = a
print("a:%d    b:%d" % (a,b))
print(id(a))
print(id(b))
結果:
a:1    b:1
1711072016
1711072016

此時如果有第三個變數c的值與a的相等,那麼c的地址與a的地址一樣。這一點請大家牢記。

a = 1
c = 1
print("a:%d    c:%d" % (a,c))
print(id(a))
print(id(c))
結果:
a:1    c:1
1711072016
1711072016

此時如果修改變數c的值,那麼會在記憶體中新開闢一塊記憶體來儲存這個變數,這塊新的記憶體地址將會賦值給c。

a = 1
c = 1
c = 2
print("a:%d    c:%d" % (a,c))
print(id(a))
print(id(c))
結果:
a:1    c:2
1711072016
1711072032

基本資料型別作為函式引數

        基本資料型別作為函式實參同樣是這個道理。

a = 1
print(id(a))
def func(x):
    print(id(x))
    x = 2
    print(id(x))

func(a)
結果:
1711072016
1711072016
1711072032

列表、字典等高階資料型別的引用

        列表字典等高階資料型別的變數名同樣儲存的變數的實際地址,一個列表名賦值給另一個變數,那麼這兩個變數便指向記憶體中的同一塊地址。

list1 = [1,2,3]
list2 = list1
print(list1,list2)
print(id(list1),id(list2))
結果:
[1, 2, 3] [1, 2, 3]
57931896 57931896

        高階資料型別在每集載入進記憶體的時候記憶體地址與上一次可能會不同。

此時如果修改list2,也會影響list1的值,但是兩個變數在記憶體中的地址還是不變的。這一點是與基本資料型別不一樣的。

list1 = [1,2,3]
list2 = list1
print(list1,list2)
print(id(list1),id(list2))
list2.append(4)
print(list1,list2)
print(id(list1),id(list2))

結果:
[1, 2, 3] [1, 2, 3]
43841656 43841656
[1, 2, 3, 4] [1, 2, 3, 4]
43841656 43841656

        此時如果有第三個列表list3的值也是[1,2,3,4],可以推測list3的地址與list1的地址應該是一樣的,但是事實並非如此。如果有第三個列表list3的值也是[1,2,3,4],相當於在記憶體中新開闢一塊記憶體來儲存這個值

list1 = [1,2,3]
list2 = list1
list3 = [1,2,3]
print(list1,list2,list3)
print(id(list1),id(list2),id(list3))
結果:
[1, 2, 3] [1, 2, 3] [1, 2, 3]
16775288 16775288 16776768

可變資料型別與不可變資料型別

        在python中哪些是可變資料型別,哪些是不可變資料型別。可變資料型別:列表list和字典dict;不可變資料型別:整型int、浮點型float、字串型string和元組tuple。
        用一句話來概括上述過程就是:“python中的不可變資料型別,不允許變數的值發生變化,如果改變了變數的值,相當於是新建了一個物件,而對於相同的值的物件,在記憶體中則只有一個物件,內部會有一個引用計數來記錄有多少個變數引用這個物件;可變資料型別,允許變數的值發生變化,即如果對變數進行append、+=等這種操作後,只是改變了變數的值,而不會新建一個物件,變數引用的物件的地址也不會變化,不過對於相同的值的不同物件,在記憶體中則會存在不同的物件,即每個物件都有自己的地址,相當於記憶體中對於同值的物件儲存了多份,這裡不存在引用計數,是實實在在的物件。

好文要頂 關注我 收藏該文  

相關推薦

Python學習-----變數引用

基本資料型別的引用        在Python中定義一個數據便在記憶體中開闢一片空間來儲存這個變數的值,這塊已經被分配的記憶體空間便會有一個記憶體地址。訪問這塊記憶體需要用到變數名,變數名實際儲存的是變數的地址在記憶體中的地址,但是使用print()函式得到的確實這塊記憶體

記錄Python學習----------------變數及簡單資料型別

在開頭先說明Python3在geany下關於中文註釋和中文程式碼,在開始一個Python程式時,在程式開頭輸入以下程式碼, #-*-coding:utf-8-*- #-*-coding:GBK-*- print("你好,Python!") 就像上圖程式碼所示。還要記住Py

Python學習-變數、字串、函式

目錄 變數和型別 條件判斷 迴圈控制 函式 變數和型別 基本變數型別 整數 浮點數 字串 布林值 空值 函式 模組 型別* 自定義型別 變數定義  變數儲存在記憶體中的值。這就意味著在建立變數時會在記憶體中開闢一個空間。 基於變數的資料型別,

python學習-基本資料型別1 變數的概念、數字、字串

1 什麼是資料型別? 每種程式語言都有自己的資料型別,用於標識計算機可以認識的資料,Python中主要的資料型別為字串,整數,浮點數,列表,元祖,字典,集合七種主要的資料型別,其中以列表,字典為最主要的資料型別。 2 什麼是變數? 在說資料型別之前,首先說一下變數,那什麼是變數?簡單講,變數就是一個容器

Python學習(1)——變數及基本資料型別

1.列印 "Hello World!" 程式碼示例: 執行結果:  2.變數 規則: (1)變數名只能包含字母、數字和下劃線,不能數字打頭 (2)變數名不能包含空格,可以使用下劃線來分割其中的單詞 (3)不要使用python關鍵字作為自己的變數名

python學習(四)

[1] size class dex epc uri msu 語句 這就是 繼續昨天的學習,學到了數組。 首先有兩個數組,name1和name2.我們可以將兩個數組合並 name1=[1,2,3,4] name2=[5,6,7,8] names=name1.extend(

Python學習 002

else 內容 readline input rjust price info class 信息   今天寫著購物車的作業,最頭疼的是文件操作了 尤其是文件的打開模式  w  r  a  最TM的頭疼 r+模式可讀可寫,但是寫的內容會根據文件指針去覆蓋之前的內容,當文件

Python學習——基礎04篇

usr pre Coding color 偶數求和 存在 代碼 spa nbsp   在python中,有很強大的for循環和很強大的數組操作,一些在其他語言中復雜的代碼,在python中可以一行解決,下面是python中解決a,b數組所有偶數求和,存在c數組中的簡單代碼。

Python學習——基礎01篇

alt 自動 clj int jca 安裝完成 -s 但是 還需                                 安裝python編譯環境   python數字定義是不需要int,double的,但是數據本身還是包含這些類型,這裏是我在學習pytho

Python學習——基礎07篇

get pytho print cnblogs python學習 code class end bsp   在Python中,數組也是不需要定義的,但是我們可以事先申明,可以用append的方法來動態增加數組空間,也可以使用range來給數組大小添個集合,這一篇先用appe

Python學習——第二彈(認識python

內容 代碼結構 計算 戰術 個人 方法 十分 現在 目的   第一彈中我是說明了學習python的目的,主要為了自我提升的考慮,那麽為什麽我對python感興趣,python有什麽用了?本章就簡單說明下。   python的用途很廣,而且代碼十分簡潔,不像java、c等其他

python學習——第三彈 (作業篇第一題)

image 操作 啟動程序 代碼 color 鎖定文件 文件 文件內容 數據 作業一:編寫登錄接口1.輸入用戶名密碼2.認證成功後顯示歡迎信息3.輸錯三次後鎖定。 所需知識點 文件基本讀寫操作,循環,列表,字典 上面的作業題是在學習完數據類型和簡單的文件操作之後布置的,

Python學習6?函數,遞歸,內置函數

erro memory 子程序 none 種類 lan 萬年 字典 得到 一python中的函數 函數是邏輯結構化和過程化的一種編程方法。 python中函數定義方法: def test(x): "The function definitions" x

Python學習8?叠代器協議和生成器

rep 好處 obj 必須 決定 內容 cnblogs 有用 pri 一 什麽是叠代器協議 1.叠代器協議是指:對象必須提供一個next方法,執行該方法要麽返回叠代中的下一項,要麽就引起一個StopIteration異常,以終止叠代 (只能往後走不能往前退) 2.可叠代對象

python學習(三)使用socketserver進行ftp斷點續傳

def += __init__ con 不存在 不為 local 接收 class 最近學習python到socketserver,本著想試一下水的深淺,采用Python3.6. 目錄結構如下: receive_file和file為下載或上傳文件存放目錄,ftp_clie

python學習-Day1

mac efm nload ucs vro tsx bic req bzoj 1.Python2.X與Python3.X選擇 選擇python3.X,原因是官方對python2.X的開發進入了校級狀態,對python2.7的支持時間只延長到了2020年。對於新手來說,建議直

Python學習——day 1

exc 默認 image java imp final python ret ber Python安裝   前往官網下載安裝包,選擇自己需要的Python版本。現在的Python早已進入3.x時代,最好選擇3.x的版本。2.x的版本已不在更新,且將在2020年停止服務。  

python學習(十二)

pack 分享 psi python 模塊 shp 詳解 階段 new from 這節主要介紹一下import!很實用的調用模塊的功能。 導入模塊 是導入真實的代碼 而導入包 是導入包下面的 __init__() 文件 這兩個是不一樣的 先說模塊定義 模塊 它就是一個

Python學習-函數

python 函數 函數定義,將一組代碼用一個名字(函數名)封裝起來,想執行這組代碼時,直接調用函數名特性,減少重復代碼,使程序變得可擴展,使程序變得易維護。def hello()#def關鍵字,後面接函數名 print("Hello Python!") #此處使用的是Python3.x的語法

基礎篇D1 -- Python學習

效率 inux 都是 動態語言 特性 set .com 原生 必須 編程語言分類 1. 編譯型和解釋型 編譯型:有負責翻譯的程序來給源代碼進行轉換,生成可執行代碼。這個過程叫做編譯(compile),負責編譯的程序叫做編譯器(compiler)。源代碼進行編譯後會生成一個可