下面这段代码有什么问题:
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
的影响。