Python 整数通过引用保存,而不是可迭代中的值

问题描述 投票:0回答:1

我有一个简单的 for 循环,其中包含一个计数变量,该变量作为字符串的一部分保存到字典中。

def chunk_page(page):
    pages = []
    chunks = chunk_string(page['content'], 500, 40)
    ints = []
    cnt = 0
    for chunk in chunks:
        ints.append(cnt)
        tmpPage = page
        if cnt == 1: chunk = chunk[0:chunk.rfind(' ')]
        else: chunk = chunk[chunk.find(' '): chunk.rfind(' ')]
        tmpPage['content'] = chunk
        if('_' in tmpPage['metadata']['id']):
            tmpPage['metadata']['id'] = str(page['metadata']['id'][0:-1] + str(int(cnt)))
        else:
            tmpPage['metadata']['id'] = str(page['metadata']['id'] + "_" + str(int(cnt)))
        pages.append(dict(tmpPage))
        cnt = cnt + 1
    return pages

在我看来,应该只迭代 id,但是在循环结束时,这些值都设置为最新值 即我得到 3 个 id 类似于 272975842_2 的页面。 我不确定我的引用在这里是如何错误的,我如何显式地将 cnt 复制到这个 str 值中,为什么添加到字符串后它仍然是 cnt ?

python pointers
1个回答
0
投票

问题不在于

cnt
,而在于
tmpPage
。当您执行
tmpPage = page
时,您并不是在创建
page
的新副本,而只是对 same 字典的 新引用。当您修改
tmpPage
时,您也在修改
page

要修复它,您需要在修改之前创建

page
的副本:

import copy
def chunk_page(page):
    pages = []
    chunks = chunk_string(page['content'], 500, 40)
    ints = []
    cnt = 0
    for chunk in chunks:
        ints.append(cnt)
        tmpPage = copy.deepcopy(page)
        # The rest of your code
© www.soinside.com 2019 - 2024. All rights reserved.