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
我认为错误在于列表中的元素数量,但我无法解决。
答案 0 :(得分:2)
那是因为列表的浅表复制或更好的表达;引用而不是将值复制到内存中。如果要使用清除功能,则需要深度复制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
[]
或者更好的是根本不使用清除功能:
>>> 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]
答案 1 :(得分:1)
逻辑是,您将三行读入列表com
,将列表 intoto 附加到ar
,然后清除子列表。 ar
拥有对com
的引用,而不是它自己读取的三个字符串的副本。
清除com
时,来自ar
的引用也会被清除; ar[x]
现在是一个空列表,没有元素0。
您需要复制元素;使用deepcopy
,或者重构您的逻辑以执行所需的操作;对于此代码段尝试执行的操作,您发布的代码不必要地复杂。例如,com
对于将行插入ar
并检测空行实际上并没有多大作用。
答案 2 :(得分:-2)
我可能错了,但我认为您需要更改此行
x=x+1
收件人
x+=1
像这样设置ar
变量:
ar=([meteo.readline(), meteo.readline(), meteo.readline()])
据我所知,这是完全一样的