import time
list01=['1','2','3','4','5','6','7']
list02=['A','B','C','D','E','F','G']
tmp=[]
News=[]
for i,j in zip(list01,list02):
tmp.append(i)
tmp.append(j)
News.append(tmp)
time.sleep(3)
print(tmp)
print(News)
tmp.clear()
個人邏輯顯示結果為
[['1','A'],['2','B'],['3','C']...]
實際結果為
[['7', 'G'], ['7', 'G'], ['7', 'G'], ['7', 'G'], ['7', 'G'], ['7', 'G'], ['7', 'G']]
list01=['1','2','3','4','5','6','7']
list02=['A','B','C','D','E','F','G']
news = []
for i,j in zip(list01, list02):
news.append([i,j])
print(news)
print('-' * 10)
print(news)
不需要使用 tmp 這個 list, 你觀察一下.
你使用了 News.append(tmp), 但是每次執行時, tmp 的內容又換成新的了.
也就是說 News裡面會有 [tmp, tmp, tmp ...]
然後最後 tmp 的內容是 [7,G], 就變成 News裡面都是 [[7,G], [7,G]...]
不,他很正常,不正常的是你
你要去理解List內部運作
Pythontutor就顯示的很清楚
import time
list01=['1','2','3','4','5','6','7']
list02=['A','B','C','D','E','F','G']
tmp=[]
News=[]
for i,j in zip(list01,list02):
tmp.append(i)
tmp.append(j)
# 這邊其實是一直append tmp 這個記憶體位址
News.append(tmp)
time.sleep(3)
print(tmp)
print(News)
tmp.clear()
# 將記憶體位址印出來你就知道了
for t in News:
# 你會發現裡面記憶體位址都一樣
print(id(t))
News2 = []
# 這樣就不同了
for i,j in zip(list01,list02):
News2.append([i, j])
附帶一提,你要的東西其實這樣就出來了
list(zip(list01, list02))
請問怎麼給兩個最佳解答...
謝謝兩位大師
這個回答比較好啦。
關鍵在於 python 的 list 是 reference。
需要做 deep copy 才會把值複製。
這我不覺得是正常,只是因為 python 是這樣設計的。
但是去看一下 pandas 的演化,
也是另一種看法
原來是python 本身就不正常
到這種頭銜的時候積分是浮雲了,不用在意啥最佳解答給誰。
人家的答案也沒錯啊。
這我不覺得是正常,只是因為 python 是這樣設計的。
考慮一下作用域
tmp=[]
News=[]
for i,j in zip(list01,list02):
News.append(tmp)
操作的一直是外層全域的tmp,其實這樣很直覺啊...
原來是python 本身就不正常
並不能這樣說,其實是你語意不對。
以你想要的用法,那個tmp不應該是在迴圈外重複利用,而是放在迴圈內,每次迭代時產生新的tmp才對。
javascript這部分的行為跟python一模一樣。動態語言的設計都還蠻雷同的。
當然這種設計會造成一些坑,例如將list當函式參數,你又在函式裡直接操作list而不是先做deep copy的時候
踩坑是成長的過程.發問者有心想理解,所以大家就來幫忙了.
在網路上有時候語言的描述,因為互動速度較慢,有時候就發散,
或是延伸出額外的討論,但有時候會變成爭執,也許當面講的時候,
可以較快的回應,就會發現殊途同歸.
Python 經過多年的發展,累積了許多便利的資料結構與語法,
也有一些較新的書,會有Python風格的 Pythonic 的介紹.
祝福發問者與熱心回答的朋友們,大家能夠在資訊的道路上,更進一步,
也能夠寫些文章分享,或是回答問題.利人利己,共同進步.
弱弱的說。其實所有的程式語言都是這樣。
主要是現在的工程師並沒經過以前二進位式的操作方式。
畢竟現在的程式語言的直譯能力已經太好了。
已經讓一些新手工程師。忘了還有定址定位的變數用法。
基本上來說。PY還是會比較偏向主直譯式的早前用法。畢竟不需要經過另外一層的轉換解釋及重新定位。效能及速度上才會比較好。
總之,這得看站在什麼角度來看。
會說python不正常的話是不對的。如果這樣子說的話。
那或許你也得說javascript也不正常了。
那所有的程式語言都不正常了。
那是很正常的。但你說的不正常也不能說你說會。
畢竟你並沒有以前那些相關知識存在。自然會認為這是不正常的。
等你知識夠了,就會知道不正常的是人還是物還是事了。