我要执行‘“列表的长度”次循环,每次循环都往列表里面添加一个元素。
听起来很傻是吧……实际上也很傻。但是不怕,毕竟我是python小白。(强行开脱)
这个问题我记得刚刚学c++的时候遇到过,但是印象不深,学python时有遇见了,特此纪念一下我傻逼的时光。
list = ['x1','x2','x3']
for item in list:
if 'x' in item:
list.remove(item)
print list
运行结果:['x2', 'x4']
这个是迭代器的问题,大概想象一下应该是刚开始迭代器指到1这个位置,把1删了,然后2顶替了1这个位置,迭代器又往后走了一个,2就这么被放过了。
list = [1,2,3]
for i in list:
list.append(i*10)
print list
死循环。
理由想想也很简单,列表变长了,迭代器走不完了。
list = [1,2,3]
for i in range(len(list)):
list.append(i*10)
print list
运行结果:[1, 2, 3, 0, 10, 20]
这个是正确的,具体原因不知道,可能因为是range只计算一次吧,之后继续原先列表长度次操作。对就对了吧,管他呢,哈哈。
list = [1,2,3]
for i in range(len(list)):
list.pop(i)
print list
这个是不正确的,会报错:IndexError: pop index out of range。因为列表边长了,但是还是执行它本身长度次操作。list = [1,2,3]
for i in range(len(list)):
list.remove(i)
print list
这个也不正确,会报错:ValueError: list.remove(x): x not in list
i = 0
list = [1,2,3]
while(i<len(list)):
list.append(i*10)
i+= 1
这个是死循环,理由应该是while括号里的判断语句每次循环都要计算一次。
好了,python里我能想象到的错误就是这些了。c++里的vector类也有迭代器,它的错误方式有少许不一样。
vector<int> ivec;
ivec.push_back(1);
ivec.push_back(2);
ivec.push_back(3);
ivec.push_back(4);
ivec.push_back(5);
//死循环
for (int i = 0; i < ivec.size(); i++)
{
ivec.push_back(i * 10);
}
这在c++里是一个死循环,这是与python不一样的地方。看来c++for语句里的判断也是每次循环计算一次的。push_back换成pop_back,删不完就结束
//报错
for (vector<int>::iterator iter = ivec.begin(); iter != ivec.end(); ++iter)
{
ivec.push_back(i++);
}
这个会直接报错,大概是说列表长度不能增加之类的,可以说是很贴心了。push_back换成pop_back同理。
//死循环
int i = 0;
while (i<ivec.size())
{
i++;
ivec.push_back(i);
}
这也是一个预料之中的死循环。push_back换成pop_back,删不完就结束了。和用for循环一毛一样。
总而言之,python里for后面的值好像不是每次循环都计算的,c++的是。
that's all