簡體   English   中英

使用 lambda 時無法將 append 條目列出

[英]Unable to append entry to list when using lambda

我在嘗試 append 我從 tkinter 的用戶輸入中收到的條目時遇到問題。我在網上找到了一些代碼,它使用 lambda 將每組條目發送到我修改過的屏幕以達到我的目的。 雖然它沒有按預期運行。

輸入示例:

Channel: 101
Serial: 123

然后我按下“下一步”按鈕,我的第一個結果是:

[['Chamber 6', 'DL 7'], ['Chan 101 (VDC)', '123']]

這是我所期望的。 問題是當我添加另一個條目時。

第二個輸入:

Channel: 103
Serial: 456

然后我再次按下一個按鈕,我的第二個結果是:

[['Chamber 6', 'DL 7'], ['Chan 103 (VDC)', '456'], ['Chan 103 (VDC)', '456']]

它總是 append 最后一個列表 x 次,而不是每次都附加修改后的列表。 使用 numpy 數組時,我也得到相同的結果。

下面是我的代碼。 有人可以解釋我需要做什么來解決這個問題嗎? 提前致謝!

# importing module
from pandas import *
import numpy as np
import tkinter as tk

fields = 'Channel', 'Serial'

chan_data = [['Chamber 6', 'DL 7']]

temp_arr = ['','']

def fetch(entries):
    for entry in entries:
        field = entry[0]
        text  = entry[1].get()
        if field =='Channel':
            temp_arr[0] = 'Chan ' + text + ' (VDC)'
        elif field == 'Serial':
            temp_arr[1] = text
            chan_data.append(temp_arr)
            print (chan_data)

def makeform(root, fields):
    entries = []
    for field in fields:
        row = tk.Frame(root)
        lab = tk.Label(row, width=15, text=field, anchor='w')
        ent = tk.Entry(row)
        row.pack(side=tk.TOP, fill=tk.X, padx=5, pady=5)
        lab.pack(side=tk.LEFT)
        ent.pack(side=tk.RIGHT, expand=tk.YES, fill=tk.X)
        entries.append((field, ent))
    return entries

if __name__ == '__main__':
    root = tk.Tk()
    ents = makeform(root, fields)
    root.bind('<Return>', (lambda event, e=ents: fetch(e)))   
    b1 = tk.Button(root, text='Next',command=(lambda e=ents: fetch(e)))
    b1.pack(side=tk.LEFT, padx=5, pady=5)
    b2 = tk.Button(root, text='Quit', command=root.destroy)
    b2.pack(side=tk.LEFT, padx=5, pady=5)
    root.mainloop()

我正在使用 Spyder 作為我的 IDE,我正在使用 Python 3.7.9。

問題是temp_arr = ['','']

它只需要在方法內部移動,因為它引用相同的 object x次。

def fetch(entries):
    temp_arr = ['','']                 <-----------
    for entry in entries:
        field = entry[0]
        text  = entry[1].get()
        if field =='Channel':
            temp_arr[0] = 'Chan ' + text + ' (VDC)'
        elif field == 'Serial':
            temp_arr[1] = text
            chan_data.append(temp_arr)
            print (chan_data)

要解決此問題,您需要在將列表傳遞給 append 時復制該列表:

#Three ways to copy
chan_data.append(temp_arr.copy())
chan_data.append(list(temp_arr))
chan_data.append(temp_arr[:])

列表temp_arr是通過引用附加的,因此更改原始temp_arr列表會更改chan_data中的列表,因為它們只是對temp_arr的引用。 調用copy()list()創建一個新列表; 更改temp_arr不會更改復制的列表。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM