1. 程式人生 > >Python程式設計學習5:python id()函式和記憶體分配理解

Python程式設計學習5:python id()函式和記憶體分配理解

1.  id()函式可返回物件的記憶體地址

python中會為每個物件分配記憶體,哪怕他們的值完全相等。id(object)函式是返回物件object在其生命週期內位於記憶體中的地址,id函式的引數型別是一個物件。如下例子:c, d 和 2.0 地址不同,但值相等。

c = 2.0
d = 2.0
print(id(c),id(d),id(2.0))
print('c == d:',c==d)
print('c is d:',c is d)

c == d 比較的是c和d的值是否相等,c is d 則比較的是c和d記憶體(或id)是否一樣。

2537439396824 2537439396776 2537439396800
c == d: True
c is d: False

2. 為了提高記憶體利用效率對於一些簡單的物件,如一些數值較小的int象,字串物件等python採取重用物件記憶體的辦法.

    (1)如指向a=2b=2時,由於2為簡單的int型別且數值小,python不會兩次為其分配記憶體,而是隻分配一次,然後將ab同時指向已分配的物件。

a = 2
b = 2
print(id(a),id(b),id(2))
print('a == b:',a==b)
print('a is b:',a is b)
1683941872 1683941872 1683941872
a == b: True
a is b: True
e = 'test'
f = 'test'
print(id(e),id(f),id('test'))
print('e == f:',e==f)
print('e is f:',e is f)
2537402630528 2537402630528 2537402630528
e == f: True
e is f: True

     (2)如對於數值較大的int物件,python會為aa和bb分別申請一塊記憶體,來儲存1999839。

aa = 1999839
bb = 1999839
print(id(aa),id(bb),id(1999839))
print('aa == bb:',aa==bb)
print('aa is bb:',aa is bb)
2537439576464 2537439576368 2537438627472
aa == bb: True
aa is bb: False

3. 記憶體分配理解

       x=3這句的執行過程並不是先獲取x原來指向的物件的地址,再把記憶體中的值更改為3,而是新申請一段記憶體來儲存物件3,再讓x去指向物件3,

所以兩次id(x)的值不同。

x=2
print(id(2))
print(id(x))
x=3
print(id(3))
print(id(x))

1683941872
1683941872
1683941904
1683941904
L=[1,2,3]
M=L
print(id(L))
print(id(M))
print(id(L[2]))
L[0]=2
print(id(L))
print(M)

2537439413000
2537439413000
1683941904
2537439413000
[2, 2, 3]

L[0] 和 L[1] 同時指向數值2,所以地址相同 (如果是2.0則地址不同)





參考文獻:https://blog.csdn.net/tycoon1988/article/details/38850443

相關推薦

Python程式設計學習5python id()函式記憶體分配理解

1.  id()函式可返回物件的記憶體地址python中會為每個物件分配記憶體,哪怕他們的值完全相等。id(object)函式是返回物件object在其生命週期內位於記憶體中的地址,id函式的引數型別是一個物件。如下例子:c, d 和 2.0 地址不同,但值相等。c = 2.

Python程式設計學習10lambda表示式filter,map函式的使用

1. lambda 表示式    (1) 優點:          a. 在寫一些簡單函式時,可以省下定義函式的過程,使得程式碼更加精簡 ,同時也簡化了程式碼的可讀性          b. 對於一些比較抽象並且只需要呼叫一兩次的函式,有時候給函式取名字也比較頭疼,使用lam

「技術乾貨」python程式設計入門須知python運算子

  學習一定是腳踏實地一步一個腳印的,程式設計也是一樣的。想要學好Python,首先來了解一遍Python程式設計入門知識之Python運算子吧。 運算子的知識主要是分為以下幾點: 1、算術運算子 2、比較(即關係)運算子 3、賦值運算子 4、邏輯運算子

python程式設計基礎2python資料型別

從一個簡單的例子開始:輸入5個數,按從大到小輸出。你怎麼做? 其實可以按照昨天的一個例題那樣子做,但是資料較多,繁瑣且容易出錯。但是使用python的列表(list)資料型別就不會這樣了。 1、列表 先通過如下的例子瞭解list的一些基本的操作: >>>

python程式設計基礎3python選擇迴圈結構

這一節的知識點很簡單:選擇:if else 迴圈:while或者for。所以這一節我們直接上例題。 1.輸入三角形的三條邊,判斷是否能組成三角形。若是可以,計算三角形的面積。 程式碼: import math a,b,c=input('please input 3 numb

三維重建學習(5)簡單地從數學原理層面理解雙目立體視覺

前言 這是我前段時間學習雙目視覺時做的筆記,這一篇文章不會進行過於細緻的推導,僅僅會在一些理想情況下做一些簡單的推導,目標是得到一個直觀上的認識:雙目視覺是如何得到三維立體座標的。以後的部落格還會再放上一些詳細的推導,和對雙目視覺提取景深的程式實現。嘛,先一步

Windows核心程式設計學習程序優先順序組執行緒優先順序

注:原始碼為學習《Windows核心程式設計》的一些嘗試,非原創。若能有助於一二訪客,幸甚。 1.基本框架 使用CreateDialog和MAKEINTERESOURCE /* * File: SchedLab.cpp * Time: 2013-04-20 * D

虛擬機器學習之二垃圾收集器記憶體分配策略

1.物件是否可回收 1.1引用計數演算法 引用計數演算法:給物件中新增一個引用計數器,每當有一個地方引用它時,計數器值就加1;當引用失效時,計數器值就減1;任何時候計數器值為0的物件就是不可能再被使用的物件。 客觀來說,引用計數演算法的實現簡單,判定效率高,在大部分情況下都是

《零基礎入門學習Python》(20)--函式內嵌函式閉包

前言 之前我們講了函式的一些相關知識,瞭解了什麼是全域性變數什麼是區域性變數,接下來我們看看怎麼將區域性變數變為全域性變數。還要將將內嵌函式的相關概念 知識點 global關鍵字  使用global關鍵字,可以修改全域性變數: >>> count

python學習筆記取整函式

三種取整方式: 一、向下取整:即捨去小數點後所有資料。int (n),例如: int(3.67) #figure out 3 二、四捨五入:round(n),例如: round(4.56) #figure out 5 round(-4.56) #figure o

python學習筆記python程式設計基礎

1、python的包的種類 自帶的包(built-in)package和外部(external)package 1.1 自帶package,舉例os、os.getwd().   3、環境變數中配置easy_install,pip 沒有提供引數,需要設定引數 easy

Python基礎學習for迴圈,函式,迭代器

12、for迴圈 """ for 變數 in 序列 執行的程式碼塊 """ list01 = ['joe', 'susan', 'jack' ,'Tom'] # 遍歷列表 for i in list01: print(i) pass空操作,無任何意義, pas

第020講函式內嵌函式閉包 | 學習記錄(小甲魚零基礎入門學習Python

(標答出處: 魚C論壇) 《零基礎入門學習Python》 測試題: 0.如果希望在函式中改變全域性變數的值,應該使用什麼關鍵字? global 1.在巢狀的函式中,如果希望在內部函式修改外部函式的區域性變數,應該使用什麼關鍵字? nonlocal 2.pyth

機器學習Python,NumPy函式庫基礎

NumPy函式庫基礎 (參考自《機器學習實戰》) 先開啟Pyhton >>> from numpy import * 引入NumPy函式庫所有模組 >>> random.rand(4,4) 隨機建立4x4矩陣 >>

Python學習筆記Python函數語言程式設計

Python學習筆記:Python函數語言程式設計 學自廖雪峰巨佬的Python3教程:https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/0014317848428125ae6a

Python機器學習筆記深入理解Keras中序貫模型函式模型

  先從sklearn說起吧,如果學習了sklearn的話,那麼學習Keras相對來說比較容易。為什麼這樣說呢?   我們首先比較一下sklearn的機器學習大致使用流程和Keras的大致使用流程: sklearn的機器學習使用流程: 1 2 3 4

python進階5外層函式、內層函式閉包

  在函式內部定義的函式和外部定義的函式是一樣的,只是他們無法被外部訪問,例如: def f(): print 'f()' def g(): print 'g()' return g #將g定義在函式f內部,防止其他程式碼呼叫g  但

python實現opencv學習floodFill填充函式函式

指定顏色填充:程式碼如下:# -*- coding=GBK -*- import cv2 as cv import numpy as np #指定顏色替換 def fill_image(image): copyImage = image.copy()#複製原影象

吳裕雄--天生自然python學習筆記python通過“任務計劃程式”實現定時自動下載或更新執行 PM2.5 資料抓取程式資料

在 Windows 任務計劃程式中,設定每隔 30 分鐘自動抓取 PM2.5 資料,井儲存 在 SQLite 資料庫中 。     import sqlite3,ast,requests,os from bs4 import BeautifulSoup #cur_path=os

Python機器學習筆記SVM(2)——SVM核函式

  上一節我學習了完整的SVM過程,下面繼續對核函式進行詳細學習,具體的參考連結都在上一篇文章中,SVM四篇筆記連結為: Python機器學習筆記:SVM(1)——SVM概述 Python機器學習筆記:SVM(2)——SVM核函式 Python機器學習筆記:SVM(3)——證明SVM Python機器學習筆記