python中引用机制,哭死!!!

下面这段代码有什么问题:

def read_file(path, n):
    tmp = []
    ans = []
    cnt = 0
    with open(path, "r") as file:
        file_contents = file.read()
    file_split = file_contents.split()
    for e in file_split:
        tmp.append(e)
        cnt += 1
        if cnt == n:
            ans.append(tmp)
            tmp.clear()
            cnt = 0
    return ans

这段代码的问题在于,它会清空tmp列表,然后将其添加到ans列表中,但这实际上将清空了tmp列表的引用,因此最终ans列表中的所有子列表都是空的。这不是您想要的结果。

要修复这个问题,您可以使用tmp.copy()创建tmp的一个副本,而不是将tmp直接添加到ans中。修改后的代码如下:

def read_file(path, n):
    tmp = []
    ans = []
    cnt = 0
    with open(path, "r") as file:
        file_contents = file.read()
    file_split = file_contents.split()
    for e in file_split:
        tmp.append(e)
        cnt += 1
        if cnt == n:
            ans.append(tmp.copy())  # 使用 tmp.copy() 创建 tmp 的副本
            tmp.clear()
            cnt = 0
    return ans

这样,每当 tmp 被添加到 ans 时,您添加的是 tmp 的副本,而不是原始的 tmp,因此 ans 中的子列表将保留其各自的内容。

这种状况的原因是与Python中列表的引用和副本机制有关。在Python中,当您将一个列表赋值给另一个变量时,实际上是将对原始列表的引用传递给了新的变量,而不是创建一个新的独立副本。这意味着如果您修改一个变量所引用的列表,那么也会影响到其他引用相同列表的变量。

在您的代码中,tmp 列表被添加到 ans 中,但实际上是添加了 tmp 列表的引用,而不是副本。

因此,当后续代码执行 tmp.clear() 时,不仅会清空 tmp 列表,还会清空 ans 列表中对 tmp 列表的引用,导致 ans 列表中的所有子列表都变为空。

为了避免这个问题,您需要确保将 tmp 列表的副本添加到 ans 中,而不是直接添加引用。

这样,ans 中的子列表将独立于 tmp 列表,不会受到后续修改 tmp 的影响。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CX__CS

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值