iT邦幫忙

0

執行append產生list of list ,但執行結果無法符合個人所需(已編輯:無法正確append的錯誤表達方式)(已解決)

  • 分享至 

  • xImage
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']]
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中
3
一級屠豬士
iT邦大師 1 級 ‧ 2022-04-18 22:26:45
最佳解答
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]...]

使用Python 不需要那樣麻煩,觀察以下的執行結果

list01=['1','2','3','4','5','6','7']
list02=['A','B','C','D','E','F','G']

print('convert to list:', list(zip(list01, list02)))
print('convert to set:', set(zip(list01, list02)))
print('convert to tuple:', tuple(zip(list01, list02)))
0
黃彥儒
iT邦高手 1 級 ‧ 2022-04-18 22:12:26

不,他很正常,不正常的是你
你要去理解List內部運作
Pythontutor就顯示的很清楚

obarisk iT邦研究生 2 級 ‧ 2022-04-18 23:09:38 檢舉

一個沒有明確使用"參照"的語言,
確真真實實的使用"參照"
這其實並不正常

froce iT邦大師 1 級 ‧ 2022-04-19 00:01:09 檢舉

一個沒有明確使用"參照"的語言,
確真真實實的使用"參照"
這其實並不正常

你這基本上就是拿靜態語言的思考去看動態語言了。

黃彥儒 iT邦高手 1 級 ‧ 2022-04-19 00:07:41 檢舉

當你想要指控一個被成千上萬人正常使用的東西不正常時,需要拿出超常的證據;而非就「和我想的不一樣」去認為某東西不正常
即使發問者完全有可能是第一個找到Bug的人,但我認為機率不高

3
froce
iT邦大師 1 級 ‧ 2022-04-18 22:44:06
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))
看更多先前的回應...收起先前的回應...
碼農 iT邦新手 4 級 ‧ 2022-04-18 22:52:37 檢舉

請問怎麼給兩個最佳解答...
謝謝兩位大師/images/emoticon/emoticon02.gif

obarisk iT邦研究生 2 級 ‧ 2022-04-18 23:08:16 檢舉

這個回答比較好啦。
關鍵在於 python 的 list 是 reference。
需要做 deep copy 才會把值複製。

這我不覺得是正常,只是因為 python 是這樣設計的。

但是去看一下 pandas 的演化,
也是另一種看法

碼農 iT邦新手 4 級 ‧ 2022-04-18 23:24:12 檢舉

原來是python 本身就不正常

froce iT邦大師 1 級 ‧ 2022-04-18 23:36:36 檢舉

到這種頭銜的時候積分是浮雲了,不用在意啥最佳解答給誰。
人家的答案也沒錯啊。

這我不覺得是正常,只是因為 python 是這樣設計的。

考慮一下作用域

tmp=[]
News=[]
for i,j in zip(list01,list02):
    News.append(tmp)

操作的一直是外層全域的tmp,其實這樣很直覺啊...

froce iT邦大師 1 級 ‧ 2022-04-18 23:47:25 檢舉

原來是python 本身就不正常

並不能這樣說,其實是你語意不對。
以你想要的用法,那個tmp不應該是在迴圈外重複利用,而是放在迴圈內,每次迭代時產生新的tmp才對。

javascript這部分的行為跟python一模一樣。動態語言的設計都還蠻雷同的。

當然這種設計會造成一些坑,例如將list當函式參數,你又在函式裡直接操作list而不是先做deep copy的時候

踩坑是成長的過程.發問者有心想理解,所以大家就來幫忙了.
在網路上有時候語言的描述,因為互動速度較慢,有時候就發散,
或是延伸出額外的討論,但有時候會變成爭執,也許當面講的時候,
可以較快的回應,就會發現殊途同歸.

Python 經過多年的發展,累積了許多便利的資料結構與語法,
也有一些較新的書,會有Python風格的 Pythonic 的介紹.

祝福發問者與熱心回答的朋友們,大家能夠在資訊的道路上,更進一步,
也能夠寫些文章分享,或是回答問題.利人利己,共同進步.

弱弱的說。其實所有的程式語言都是這樣。
主要是現在的工程師並沒經過以前二進位式的操作方式。
畢竟現在的程式語言的直譯能力已經太好了。

已經讓一些新手工程師。忘了還有定址定位的變數用法。

基本上來說。PY還是會比較偏向主直譯式的早前用法。畢竟不需要經過另外一層的轉換解釋及重新定位。效能及速度上才會比較好。

總之,這得看站在什麼角度來看。

會說python不正常的話是不對的。如果這樣子說的話。
那或許你也得說javascript也不正常了。
那所有的程式語言都不正常了。

那是很正常的。但你說的不正常也不能說你說會。
畢竟你並沒有以前那些相關知識存在。自然會認為這是不正常的。
等你知識夠了,就會知道不正常的是人還是物還是事了。

我要發表回答

立即登入回答