使用 lambda 时无法将条目附加到列表

Unable to append entry to list when using lambda

我在尝试附加从 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']]

它总是附加最后一个列表 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 = ['','']

它只需要在方法内部移动,因为它引用同一个对象 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)

要解决此问题,您需要在将列表传递到附加时复制列表:

#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 不会更改复制的列表。