1. 程式人生 > >python編程之賦值和拷貝的區別概述及操作excel數據庫(圖)

python編程之賦值和拷貝的區別概述及操作excel數據庫(圖)

may 格式 work val 原子 註意 更遠 當我 就是

python編程之賦值和拷貝的區別概述及操作excel數據庫(圖)
一、賦值
在Python中,對象的賦值就是簡單的對象引用,這點和C++不同,如下所示:
a = [1,2,”hello”,[‘python’, ‘C++’]]
b = a
在上述情況下,a和b是一樣的,他們指向同一片內存,b不過是a的別名,是引用。
我們可以使用bisa 去判斷,返回True,表明他們地址相同,內容相同,也可以使用id()函數來查看兩個列表的地址是否相同。
賦值操作(包括對象作為參數、返回值)不會開辟新的內存空間,它只是復制了對象的引用。也就是說除了b這個名字之外,沒有其他的內存開銷。修改了a,也就影響了b,同理,修改了b,也就影響了a。
二、淺拷貝(shallow copy)
淺拷貝會創建新對象,其內容非原對象本身的引用,而是原對象內第一層對象的引用。
淺拷貝有三種形式:切片操作、工廠函數、copy模塊中的copy函數。
比如上述的列表a;
切片操作:b = a[ : ] 或者 b = [ x for x in a ];
工廠函數:b = list( a );
copy函數:b = copy.copy( a );
淺拷貝產生的列表b不再是列表a了,使用is判斷可以發現他們不是同一個對象,使用id查看,他們也不指向同一片內存空間。但是當我們使用id(x) for x in a 和 id(x) for x in b來查看a和b 中元素的地址時,可以看到二者包含的元素的地址是相同的。

技術分享圖片

在這種情況下,列表a和b是不同的對象,修改列表b理論上不會影響到列表a。
但是要註意的是,淺拷貝之所以稱之為淺拷貝,是它僅僅只拷貝了一層,在列表a中有一個嵌套的list,如果我們修改了它,情況就不一樣了
比如:a[3].append(‘java’)。查看列表b,會發現列表b也發生了變化,這是因為,我們修改了嵌套的list,修改外層元素,會修改它的引用,讓它們指向別的位置,修改嵌套列表中的元素,列表的地址並未發生變化,指向的都是用一個位置。
三、深拷貝(deep copy)
深拷貝只有一種形式,copy模塊中的deepcopy()函數。
深拷貝和淺拷貝對應,深拷貝拷貝了對象的所有元素,包括多層嵌套的元素。因此,它的時間和空間開銷要高。
同樣的對列表a,如果使用 b = copy.deepcopy(a),再修改列表b將不會影響到列表a,即使嵌套的列表具有更深的層次,也不會產生任何影響,因為深拷貝拷貝出來的對象根本就是一個全新的對象,不再與原來的對象有任何的關聯。
四、拷貝的註意點
對於非容器類型,如數字、字符,以及其他的“原子”類型,沒有拷貝一說產生的都是原對象的引用。
如果元組變量值包含原子類型對象,即使采用了深拷貝,也只能得到淺拷貝。
python操作excel:
讀取excel
首先導入包xlrd
import xlrd # 用來讀取excel
打開excel
workBook = xlrd.open_workbook(r‘xj.xlsx‘) # 打開文件
獲取表
workBook.sheet_names() # 獲取excel中所有的sheet表
>>> [‘Sheet1‘, ‘凈持倉‘, ‘保稅區庫提價‘, ‘期貨合約‘, ‘國內市場上海地區‘, ‘保稅區庫存‘, ‘期貨情況‘, ‘日膠收盤價‘, ‘新加坡結算價‘, ‘渤商所天然橡膠‘]
獲取表中內容
# 根據索引來獲取到sheet表的內容
sheet1 = workBook.sheet_by_index(0)
print(sheet1)
>>> <xlrd.sheet.Sheet object at 0x0000000005C16358>
# 根據表名來獲取到sheet表的內容
sheet2 = workBook.sheet_by_name(‘保稅區庫提價‘)
print(sheet2)
>>> <xlrd.sheet.Sheet object at 0x0000000005C16358>
獲取表的詳細內容
# 獲取表的表名 行數 列數
print(sheet.name,sheet.nrows,sheet.ncols)
>>> 保稅區庫提價 586 16
# 獲取整行數據
print(sheet.row_values(3))
>>> [43307.0, 1490.0, 1305.0, 0.0, 0.0, 1315.0, 0.0, ‘‘, ‘‘, 43307.0, 1490.0, 1305.0, 1320.0, 1340.0, 1315.0, 0.0]
獲取表中單元格內容
# 獲取單元格內數據
print(sheet.cell(1,3).value)
print(sheet.cell_value(1,3))
print(sheet.row(1)[3].value)
print(sheet.row_values(1)[3])
>>> 庫提價:天然橡膠(SIR20,印度尼西亞產):青島保稅區倉庫
>>> 庫提價:天然橡膠(SIR20,印度尼西亞產):青島保稅區倉庫
>>> 庫提價:天然橡膠(SIR20,印度尼西亞產):青島保稅區倉庫
>>> 庫提價:天然橡膠(SIR20,印度尼西亞產):青島保稅區倉庫
獲取單元的數據類型
# ctype : 0 empty,1 string, 2 number, 3 date, 4 boolean, 5 error
print(sheet.cell(1,0).value)
print(sheet.cell(1,0).ctype)
print(sheet.cell(3,0).value)
print(sheet.cell(3,0).ctype)
>>> 指標名稱
>>> 1
>>> 43307.0
>>> 3
因為獲取到excel中的時間為date,所以需要特殊處理
print(xlrd.xldate_as_datetime(sheet.cell(3,0).value,0))
>>> 2018-07-26 00:00:00
print(xlrd.xldate_as_tuple(sheet.cell(3,0).value,0))
>>> (2018, 7, 26, 0, 0, 0)
xlrd.xldate_as_tuple(sheet.cell(3,0).value,workBook.datemode)
>>> (2018, 7, 26, 0, 0, 0)
# 數數據格式
date(*value[:3]).strftime(‘%Y/%m/%d‘)
Python在執行時,首先會將.py文件中的源代碼編譯成Python的byte code(字節碼),然後再由Python Virtual Machine(Python虛擬機)來執行這些編譯好的byte code。這種機制的基本思想跟Java,.NET
是一致的。然而,Python Virtual Machine與Java或.NET的Virtual Machine不同的是,Python的Virtual Machine是一種更高級的Virtual Machine。
這裏的高級並不是通常意義上的高級,不是說Python的Virtual Machine比Java或.NET的功能更強大,呼嘯山莊讀後感

心得體會,而是說和Java 或.NET相比,Python的Virtual Machine距離真實機器的距離更遠。或者可以這麽說,Python的Virtual Machine是一種抽象層次更高的Virtual Machine。
基於C的Python編譯出的字節碼文件,通常是.pyc格式。
除此之外,Python還可以以交互模式運行,比如主流操作系統Unix/Linux、Mac、Windows都可以直接在命令模式下直接運行Python交互環境。直接下達操作指令即可實現交互操作。

python編程之賦值和拷貝的區別概述及操作excel數據庫(圖)