1. 程式人生 > >Lua table的remove和nil操作的區別

Lua table的remove和nil操作的區別

我在看《Lua程式設計(第二版)》的時候,這本書不是看了不止一遍了,每次看都有新發現。
今天看到這麼一句話:Lua中的table可以像全域性變數一樣,將nil賦予table的某個元素來刪除該元素。瞭解Lua的都知道Lua的table還有個table.remove方法來刪除table中的制定元素,對於這兩種刪除table元素的方法,我每次總搞混刪除後table究竟變成了什麼樣子,為了以後再忘記,今天就自己敲了幾行程式碼,以後方便檢視。

首先看一下使用賦值nil的方式刪除table元素的結果

a = {1, 2, 3, 4, 5}
print("刪除元素前的a: ")
for k, v in
ipairs(a) do print(k, v) end print("刪除元素前a的長度 : ", #a) a[4] = nil print("刪除元素後的a : ") for k, v in ipairs(a) do print(k, v) end print("刪除元素後a的長度 : ", #a) print("a[4] = ", a[4], "a[5] = ", a[5])

打印出的結果:
這裡寫圖片描述

從結果可以看到,只是table的第四個元素變成了nil,其長度仍然是5,在使用ipairs列印a的元素的時候碰到nil結束迴圈,影響的僅僅是第四個元素,其他位置的元素均保持不變。

再來看一下table.remove方法

a = {1, 2, 3, 4, 5}
print("刪除元素前的a: ")
for k, v in ipairs(a) do
    print(k, v)
end
print("刪除元素前a的長度 : ", #a)
table.remove(a, 4)

print("刪除元素後的a : ")
for k, v in ipairs(a) do
    print(k, v)
end
print("刪除元素後a的長度 : ", #a)
print("a[4] = ", a[4], "a[5] = ", a[5])

table.remove的結果
這裡寫圖片描述

從結果可以看出table.remove真正刪除了第4個元素,後面的元素向前挪了一個位置,也就是說,table.remove刪除元素影響到了後面的元素位置。

注意:這裡的table類似與陣列的概念,類似字典的使用nil刪除即可。

相關推薦

Lua table的removenil操作區別

我在看《Lua程式設計(第二版)》的時候,這本書不是看了不止一遍了,每次看都有新發現。 今天看到這麼一句話:Lua中的table可以像全域性變數一樣,將nil賦予table的某個元素來刪除該元素。瞭解Lua的都知道Lua的table還有個table.remov

scala中None Null Nothing Nil區別

None是一個object,是Option的子型別,定義如下  [java] view plain copy  print? case object None extends Option[Nothing] {     def isEmpty = true     def

cropresize操作區別

net tro 剪切 str ext rect 結果 code nts crop:對圖像進行剪切 resize:對圖像進行伸縮 實踐代碼 import cv2 bb2d = [30, 30, 72 ,42] image = cv2.imread(‘car.png‘) pt1

Lua中調用函數使用點號冒號的區別

別了 tab tle sel n) self 方式 fun 輸出 1.初學者最易混亂Top1——調用函數時用點號還是用冒號? 我們來看看下面的兩句代碼: mSprite.setPosition(100, 20); mSprite:setPosition(100, 20)

SqlAlchemy 中操作數據庫時sessionscoped_session的區別

tro color war mapped 數據庫 大小 bind nes email 原生session: from sqlalchemy.orm import sessionmaker from sqlalchemy import create_engine from

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

may 格式 work val 原子 註意 更遠 當我 就是 python編程之賦值和拷貝的區別概述及操作excel數據庫(圖)一、賦值在Python中,對象的賦值就是簡單的對象引用,這點和C++不同,如下所示:a = [1,2,”hello”,[‘python’, ‘C+

nilnull的區別

點擊 指針 href 報錯 csdn per 區別 tail 對象 NULL? ? ?? ? 只能作為指針變量的值.如果1個指針變量的值是NULL值代表.代表這個指針不指向內存中的任何1塊空間 ? ?? ? NULL其實等價於0? NULL其實是1個宏.就是0 ? ? ?

lua中pairs ipairs 的區別

1、table中儲存值的時候,是按照順序儲存的,儲存 k-v 的時候,是按照 k 的雜湊值儲存的。 2、ipairs --- 只能輸出 table 中的值,並且不可輸出nil,遇到 ni l就退出    pairs --- 可以輸出 table 中的值與 k-v ,並且是按照先輸出值,再亂序輸出

js中style,currentStyle,getComputedStylegetBoundingClientRect的區別以及獲取css操作方法

js中style,currentStyle,getComputedStyle和getBoundingClientRect的區別以及獲取css操作方法 在js中,之前我們獲取屬性大多用的都是ele.style.border這種形式的方法,但是這種方法是有侷限性的,該方法只能獲取到行內樣式,獲取不

ArrayListHashSet的增刪操作區別

一, List和Set public static void main(String[] args) { test1(); } public static void test1() { List<Integer> list = new ArrayL

freopenfopen的區別(檔案操作輸入輸出)

C語言中freopen()函式是用來重新定向的,所謂重新定向是給輸入和輸出的位置重新定向。原本輸入位置是鍵盤快取區,輸出在螢幕上,用了重新定向後可以將輸入位置改變成一個檔案,而輸出位置也可以輸出到一個檔案中,具體程式碼可以這麼寫: freopen ("text.txt"

MyBatis Generator生成的CRUD操作中,insertSelectiveinsert的區別

專案需要需要使用MyBatis Generator,generator可生成以下幾種的CURD操作。 1.insert() 2.insertSelective() 3.updateByPrimaryKeySelective() 4.updateByPrimaryKey() 5.s

linux的命令列操作shell的區別

      這個問題也是突然想起來的,因為我身邊的同事有時候會把這兩個區別的表述,所以我就好奇了,到底是什麼關係呢,他們都能操作Linux系統啊。。後來百度一下才知道大致的區別。 一、什麼是shell 答:       shell翻譯成殼的意思,它是包

Linux 操作命令 less 以及less 與 cat more 的區別

inux 目錄 通過 自動 -- ESS 百分比 文件內容 文件 1、簡介 ????linux 正統查看文件內容的工具,功能極其強大???? 2、主要功能 ????less 工具也是對文件或其它輸出進行分頁顯示的工具???? 3、用法/命令格式 less [選項]

STL中的vectorqueue操作區別

主要是記錄下自己的使用STL的錯誤。。 vector有以下這些功能,注意pop_bcak去掉的是最後一個元素,而queue的pop去掉的是首元素,自己經常搞混了。。 1.push_back 在陣列的最後新增一個數據 2.pop_back 去掉陣列

關於nil nullNSNull的區別

1、nil和null從字面意思來理解比較簡單,nil是一個物件,而NULL是一個值,我的理解為nil是將物件設定為空,而null是將基本型別設定為空的,個人感覺有點像屬性當中,基本型別分配為assign NSString型別一般分配copy,而物件一般用retain。而且我們對於nil呼叫方法,不會產生cr

OpenCV中操作Mat的copy()clone()的區別

OpenCV中使用Mat,經常會碰到這樣一種場景,會想拷貝一份Mat,並對新的Mat進行操作。但是OpenCV中的clone()和直接賦值都會導致共享資料區,也就是相當於&。 而使用copy,才會獲取新的Mat。 // Mat is basically a clas

nilNULL 的區別

  1. NULL  只能作為指標變數的值. 如果1個指標變數的值是NULL值代表. 代表這個指標不指向記憶體中的任何1塊空間      NULL其實等價於0  NULL其實是1個巨集.

簡述邏輯操作(&,|,^)條件操作(&&,||)的區別

有兩個重要的區別: 1. 位邏輯運算通常是針對兩個數而言;而條件邏輯運算是針對兩個條件表示式而言 2. 位邏輯操作符一樣可以實現條件操作,但是此時有一個重要的區別:用位操作符時,不管操作符兩邊的條件表示式成不成立,它都要通通進行運算判斷,而條件邏輯操作符不一樣了,如果通過左

Lua庫之時間日期操作

os.time() <== 返回當前系統的日曆時間 os.date() <== 返回本地化的時間字串,這裡是"11/28/08 17:23:37" os.date("%x", os.time()) <== 返回自定義格式化時間字串(完整的格式化引數),這裡是