為什么append追加后,顯示的內容是最后一次輸入的內容??
uj5u.com熱心網友回復:
我想應該是 alist.append 是指向了 blist 的空間, python 的 while 可能優化了代碼, 最后再一起生成 alist按你的程式邏輯。 改成這樣比較合適
def get_input():
name = input('name: ')
id = input('id: ')
return [name, id]
i = 0
alist = []
while i<2:
blist = get_input()
alist.append(blist)
i = i + 1
print(alist)
uj5u.com熱心網友回復:
其實我也就是比較想了解它的記憶體空間的指向uj5u.com熱心網友回復:
那就是 查 blist 的 id
def get_input():
name = input('name: ')
id = input('id: ')
return [name, id]
i = 0
alist = []
while i<2:
blist = get_input()
print('times {} blist id '.format(i) , id(blist))
alist.append(blist)
i = i + 1
print(alist)
這里的 id 每次都不一樣, 說明指向不同的存盤空間。 你的代碼,查看blist的id , 是指向同一地址的。
uj5u.com熱心網友回復:
串列、字典這類容器作引數,是傳地址的,不會復制你寫個函式修改串列,傳入串列作引數,原串列會被改變。
想復制,就用切片
alist.append(blist[:])
uj5u.com熱心網友回復:
這和你的寫法和深淺拷貝有關,你可以看戲深淺拷貝下,串列時可變型別,像你那樣寫alist[0],alist[1]指向的值的記憶體地址都是一樣的,無論你對alist[0]還是alist[1]修改,修改的都是一個記憶體地址的值,就是你一開始定義的blist,想實作你的效果可以使用深拷貝,這樣就可以實作你想要擁有的效果,深拷貝給a[0],a[1]每次都開辟新的記憶體空間。from copy import deepcopy
i = 0
alist = []
clist = []
blist = ["",""]
print(id(blist))
while i < 2:
blist[0] = input("name")
blist[1] = input("age")
print(id(blist))
d = deepcopy(blist)
print(id(d))
clist.append(blist)
alist.append(d)
i = i+1
print(clist)
print(id(clist[0]),id(clist[1]))
print(alist)
print(id(alist[0]),id(alist[1]))

你也可以換種寫法,每一次都重新初始化blist的值。
i = 0
alist = []
while i < 2:
blist = []
print(id(blist))
blist.append(input("name"))
blist.append(input("age"))
alist.append(blist)
i += 1
print(alist)
print(id(alist[0]),id(alist[1]))

uj5u.com熱心網友回復:
串列的本質其實相當于C語言中的指標的用法,一個串列名就是一個指向一片區域的指標,可以理解為一個建筑物的地址。對于一個串列的append函式其實就相當于給該串列的最后一個元素賦值。如果賦值的物件是一個串列就相當于是把這個串列的地址給了被賦值的物件。在你的程式中,alist.append(blist)這條陳述句就等同于把blist串列的地址放到alist的第一個和第二個元素的位置上,也就是說這兩個元素指向的是同一片存盤空間,所以你的程式運行結果就會都是最后一次輸入的值。
如果想要實作復制串列的值而不是地址的話,可以用
1.切片,即alist.append(blist[:])
2.copy函式,即alist.append(blist.copy())
3.將blist串列的宣告放到回圈內,這時相當于每次回圈blist都會重新申請一片存盤空間,自然所指向的地址也就不同了。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/65332.html
上一篇:下載的深度學習代碼,它的訓練集和測驗集儲存在哪,我能查看嗎
下一篇:隨機森林的方差是什么?怎么求?
