Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用.pop()时出现奇怪的反应_Python_Python 3.x - Fatal编程技术网

Python 使用.pop()时出现奇怪的反应

Python 使用.pop()时出现奇怪的反应,python,python-3.x,Python,Python 3.x,我正在做一些练习,我的任务是从字符串中删除第一个数字,直到它变为奇数 该函数应删除lst前面的元素,直到列表前面不均匀为止。然后该函数应返回lst 例如,如果lst以[4,8,10,11,12,15]的形式启动,则delete_starting_evens(lst)应返回[11,12,15] def delete_start_evens(lst): 对于lst中的i: 如果i%2==0: 一级流行音乐(0) 其他: 打破 返回lst 打印(删除起始日([4,8,6,6,6,10,11,12,15

我正在做一些练习,我的任务是从字符串中删除第一个数字,直到它变为奇数

该函数应删除lst前面的元素,直到列表前面不均匀为止。然后该函数应返回lst

例如,如果lst以
[4,8,10,11,12,15]
的形式启动,则delete_starting_evens(lst)应返回
[11,12,15]

def delete_start_evens(lst):
对于lst中的i:
如果i%2==0:
一级流行音乐(0)
其他:
打破
返回lst
打印(删除起始日([4,8,6,6,6,10,11,12,15]))
打印(删除起始日([4,8,10]))

def delete_start_evens(lst):
对于lst中的i:
如果i%2==0:
lst=lst[1:]
其他:
打破
返回lst
打印(删除起始日([4,8,6,6,6,10,11,12,15]))
打印(删除起始日([4,8,10]))`
如果我使用
lst=lst[1://code>,代码将按预期工作,

但是我不明白为什么
lst.pop(0)
版本不起作用。它将在几次迭代中有效,但随后不再弹出。

在迭代列表时修改列表通常会得到奇怪的结果。尝试在每次迭代中打印
lst
i
,您将看到发生了什么。。。(尝试使用
lst=[2,4,6,8,10,…]
使其更清晰…)

这里有一个安全的方法:

def delete_starting_evens(lst):
    for i, x in enumerate(lst):
        if x % 2 != 0:
            break
    else:
        return []
    return lst[i:]
请注意,
pop
会对列表进行变异,而
lst=lst[1:]
会重新分配它

如果效率很重要:

def f():
    lst = list(range(0,10000,2))+[3,0,2,4,6]
    for i, x in enumerate(lst):
        if x % 2:
            break
    else:
        return []
    return lst[i:]

def g():
    lst = list(range(0,10000,2))+[3,0,2,4,6]
    while lst and lst[0] % 2 == 0:
        lst.pop(0)
    return lst

%timeit f()
# 334 µs ± 2.17 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

%timeit g()
# 2.09 ms ± 12.9 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

一个更简单的解决方案是
,而lst[0]%2==0:lst.pop(0)
(实际上需要检查
,而lst和lst[0]%2==0
是安全的…)谢谢,说得好。或者将其作为一个输入条件:
如果lst:whilelst[0]%2==0:
列表。pop(0)
是一个O(n)操作,因此我不建议在循环中执行。您发布的解决方案要好得多。@ggorlen是的,我本来打算发布,但我在比较测试中遇到了一个错误,错误地显示了相反的结果:)。现在已修复并添加。