嵌套文本inpu列表索引超出范围

2024-06-03 06:53:15 发布

您现在位置:Python中文网/ 问答频道 /正文

meteo = open('meteo.txt', 'r+')
meteo.seek(0, 0)
ar = []
a=True
x=0
while a:
    com=[meteo.readline(), meteo.readline(), meteo.readline()]
    ar.append(com)
    print(ar[x], '___', com)
    com.clear()
    if ar[x][0] == '':
        a=False
    x=x+1

我得到这个错误:

Traceback (most recent call last):
  File "C:\Users\Utente\Desktop\DEV - enviroment\Python\Script\Es. 56 Pag. 157.py", line 11, in <module>
    if ar[x][0] == '':
IndexError: list index out of range

我认为错误在列表的元素数上,但我无法修复它。你知道吗


Tags: txtcomfalsetruereadlineif错误seek
3条回答

这是因为列表的浅层复制或者用更好的术语;引用而不是在内存中复制值。如果你想使用清除功能,你需要深度复制com列表。以下是您目前所做的:

>>> li = []
>>> inli = [1, 2, 3]
>>> li.append(inli)
>>> li
[[1, 2, 3]]
>>> inli
[1, 2, 3]
>>> inli.clear()
>>> li
[[]]
>>> inli
[]

你需要做的是:

>>> import copy
>>> li = []
>>> inli = [1, 2, 3]
>>> li.append(copy.deepcopy(inli))
>>> li
[[1, 2, 3]]
>>> inli
[1, 2, 3]
>>> inli.clear()
>>> li
[[1, 2, 3]]
>>> inli
[]

或者最好不要使用clear函数:

>>> li = []
>>> inli = [1, 2, 3]
>>> li.append(inli)
>>> li
[[1, 2, 3]]
>>> inli
[1, 2, 3]
>>> inli = [4, 5, 6]
>>> li
[[1, 2, 3]]
>>> inli
[4, 5, 6]

我可能错了,但我认为你需要改变这条线路

x=x+1

x+=1

设置ar变量如下:

ar=([meteo.readline(), meteo.readline(), meteo.readline()])

据我所知,这是完全一样的

逻辑是将三行读入一个列表com,将列表全部附加到ar,然后清除子列表。ar保存对com的引用,而不是您读取的三个字符串的自身副本。你知道吗

清除com时,来自ar的引用也被清除;ar[x]现在是一个空列表,没有元素0。你知道吗

您需要复制元素;使用deepcopy,或者重新考虑您的逻辑以执行所需的操作;您发布的代码对于此代码段尝试执行的操作来说是不必要的复杂。例如,com在将行放入ar并检测空行方面实际上做得不多。你知道吗

相关问题 更多 >