Python之列表的append()方法最容易踩的坑及解決

大雄45發表於2023-03-28
導讀 這篇文章主要介紹了Python之列表的append()方法最容易踩的坑及解決,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
Python列表的append()方法踩坑

在這之前,我一直認為append()只是個將一個物件新增到列表尾部的方法,但是今天之後,我對它有了一個新的認識。

一般情況下,我們都是這樣使用:

list = [1,2,3]
list.append(4)
# list列表就變成了[1,2,3,4]

但是在後來的使用中,遇到了像下面這樣的問題:

a = [1,2]
b = []
 
b.append(a)
print(b)
 
a.append(3)
print(b)
# 此時b的結果為[[1,2,3]]
# 是的,你沒看錯,就是[[1,2,3]]

明明兩次列印之間沒有對b進行任何操作,那麼b為什麼會發生變化,問題肯定是出在了append方法上。

透過一系列的資料查詢,發現append方法是淺複製方法,什麼是淺複製呢?

官方一點的解釋就是:

在Python中,物件賦值實際上是物件的引用,當建立一個物件,然後把它賦值給另一個變數的時候,Python並沒有複製這個物件,而只是複製了這個物件的引用,這就是淺複製。

什麼,你說你還沒懂淺複製?沒關係,下面還有:

a = 1
b = 1
 
print(id(a))
print(id(b))
# 此時你會發現,a和b在記憶體中的地址居然是一樣的

因為在Python中,先是生成了物件,然後才是變數對物件的引用。比如,1是一個物件,然後a和b再分別對1進行引用,由於常數是不可變型別,所以1的記憶體空間是一樣的,所以a和b共用一塊記憶體空間。

形象的來解釋就是:

有一個盒子,盒子裡面放著1,然後a和b對1進行引用的時候就是直接把a和b的標籤貼到這個盒子上。

迴歸正題:

a = [1,2]
b = []
 
b.append(a)
print(b)
 
a.append(3)
print(b)
# 開始時a這個盒子等於[1,2],b這個盒子等於[]
# 使用b.append(a)相當於將盒子a放入盒子b中
# 所以再使用a.append(3)的時候,b也會跟著一起改變呀!!!
Python列表的append函式
append的功能

將一個元素新增到當前列表中

append的用法

用法:list.append(new_item)

引數:new_item:新增進列表的新的元素(成員)

In [19]: names = ['insane']
In [20]: names.append('loafer')
In [21]: print(names)
['insane', 'loafer']
append的注意事項
  • 被新增的元素只會被新增到末尾變數
  • append函式是在原有列表的基礎上新增,不需要額外新增新的變數
  • 實戰

    每次只能新增一個變數

# coding:utf-8
 
books = []
print(id(books))
books.append('python')
print(books)
print(id(books))
 
number = 1.1
tuple_test = (1,)
dict_test = {'name': 'insane'}
 
books.append(number)  # 每次只能加入一個變數
books.append(tuple_test)
books.append(dict_test)
print(books)
 
books.append('django')
books.append(1)
print(books)
print(id(books))
2029563540224
['python']
2029563540224
['python', 1.1, (1,), {'name': 'insane'}]
['python', 1.1, (1,), {'name': 'insane'}, 'django', 1]
2029563540224
Process finished with exit code 0

原文來自:


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69955379/viewspace-2929388/,如需轉載,請註明出處,否則將追究法律責任。

相關文章