【问题标题】:Why is append overwriting everything in the list with the new element?为什么追加用新元素覆盖列表中的所有内容?
【发布时间】:2012-08-07 08:06:06
【问题描述】:

我正在编写一个 Python 脚本,该脚本读取一个 CSV 文件并创建一个双端队列列表。如果我在添加之前准确打印出添加到列表中的内容,它看起来就像我想要的,但是当我打印出列表本身时,我可以看到 append 正在用最新的元素覆盖列表中的所有元素。

    # Window is a list containing many instances            
def slideWindow(window, nextInstance, num_attributes):
    attribute = nextInstance.pop(0)
    window.popleft()
    for i in range(num_attributes):
        window.pop()
    window.extendleft(reversed(nextInstance))
    window.appendleft(attribute)
    return window

def convertDataFormat(filename, window_size):
    with open(filename, 'rU') as f:
        reader = csv.reader(f)

        window = deque()
        alldata = deque()

        i = 0
        for row in reader:
            if i < (window_size-1):
                window.extendleft(reversed(row[1:]))
                i+=1
            else:
                window.extendleft(reversed(row))
                break

        alldata.append(window)

        for row in reader:
            window = slideWindow(window, row, NUM_ATTRIBUTES)
            alldata.append(window)
#             print alldata

        f.close()
        return alldata

【问题讨论】:

  • 旁注:当你使用with open(...)时,你不需要关闭文件。事实上,这是上下文管理器的优势之一。

标签: python list append overwrite


【解决方案1】:

【讨论】:

    【解决方案2】:

    这真的很难从这段代码中跟踪你到底想要什么。我怀疑问题出在以下几点:

    alldata.append(window)
    
    for row in reader:
        window = slideWindow(window, row, NUM_ATTRIBUTES)
        alldata.append(window)
    

    请注意,在您的slideWindow 函数中,您修改了输入双端队列 (window),然后返回修改后的deque。因此,您将deque 放入列表的第一个元素,然后修改该对象(在slideWindow 内)并将另一个引用 附加到列表中的同一对象。 p>

    你打算这样做吗?

    简单的解决方法是将window 输入复制到slideWindow 并修改/返回副本。

    【讨论】:

    • 对不起,我的代码太混乱了。我不知道 Python 通过引用传递所有内容,所以我必须制作一个 window 副本,然后将其添加到 alldata。感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 2018-07-21
    • 1970-01-01
    • 2017-05-15
    • 2021-09-18
    • 2022-06-15
    • 2014-10-29
    • 2022-01-06
    • 1970-01-01
    相关资源
    最近更新 更多