对于这个python问题,我在一个参数中接受一个int,这是我要附加的列表的最大长度。从int值1开始,我想遍历列表,追加两个更多的线性值,直到达到最大长度。
我得到一个无限循环或类似的东西;我没有收到任何值,但python仍在处理中。
这是无限循环发生的代码,想知道为什么? 代码:
def dbl_linear(n):
lst_u =[1]
while len(lst_u)<=n:
for i in lst_u:
lst_u.append(2*i+1)
lst_u.append(3*i+1)
return sorted(lst_u)
dbl_linear(10)
我查看了这个示例,用户已将变量设置为另一个包含for循环之前的列表的变量,然后在循环之后将其更改回来。想知道为什么这样做以及为什么它有用? 其他代码: d
ef dbl_linear(n):
lst_u =[1]
while len(lst_u)<=n:
new_u = lst_u
for i in lst_u:
new_u.append(2*i+1)
new_u.append(3*i+1)
new_u=lst_u
return sorted(lst_u)
dbl_linear(10)
答案 0 :(得分:1)
当您循环播放列表时,您将添加到列表中。列表迭代器只是递增位置计数器并返回该索引处的值,直到索引不存在。它没有预先跟踪列表的长度。在您的情况下,通过向末尾添加更多元素,迭代器永远不会到达不存在的索引。
您有几种选择:
首先创建列表的副本以进行迭代;那份副本不会成长:
def dbl_linear(n):
lst_u = [1]
while len(lst_u)<=n:
for i in lst_u[:]: # [:] returns a shallow copy
lst_u.append(2*i+1)
lst_u.append(3*i+1)
return sorted(lst_u)
附加到单独的新列表并在循环后扩展原始文件:
def dbl_linear(n):
lst_u = [1]
while len(lst_u)<=n:
new_values = []
for i in lst_u:
new_values.append(2*i+1)
new_values.append(3*i+1)
lst_u.extend(new_values)
return sorted(lst_u)
使用range()
生成索引;这是基于长度一次:
def dbl_linear(n):
lst_u = [1]
while len(lst_u)<=n:
for idx in range(len(lst_u)):
i = lst_u[idx]
lst_u.append(2*i+1)
lst_u.append(3*i+1)
return sorted(lst_u)