在循环里改变一个容器的长度是一件愚蠢的事情

本文讲述了在Python和C++中,于循环内部修改列表或vector长度导致的问题。作者通过个人经历指出,这种操作在Python中可能导致元素遗漏,而在C++中则与迭代器有关。提醒程序员注意这两种语言中迭代器的工作方式差异。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我要执行‘“列表的长度”次循环,每次循环都往列表里面添加一个元素。

听起来很傻是吧……实际上也很傻。但是不怕,毕竟我是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




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值