|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
- def ysf(n, step, stop):
- lst = list(range(1, n+1))
- check = 0
- while len(lst) > stop:
- for i in lst:
- check += 1
- if check == step:
- check = 0
- lst.remove(i)
- print('{0}号下船了'.format(i))
- num = int(input('请输入总人数: '))
- s = int(input('请输入周期: '))
- la = int(input('请输入剩余人数: '))
- ysf(num, s, la)
复制代码
这是约瑟夫生者死者小游戏,程序执行没问题。
但是执行结果只有第一个是对的,从第二个开始就不对了,
我用了pycharm进行调试,当i=9的时候没问题,但是下一步直接进行到了i=11了,中间跳过了i=10这一步,
哪位前辈帮忙解答一下,这是为什么呀?
本帖最后由 qq1151985918 于 2021-6-11 09:08 编辑
当你移除列表一个元素的时候,这个列表的索引值就已经发生变化了,删除的元素位置由后边的元素顶替,所以会出现遍历列表但是会出现遗漏的情况,所以我们一般对原列表的副本进行遍历。不止是列表,所有可变化的容器类可迭代对象(列表、集合、字典等)都有这个特点
参考小案例
- data = [1,2,3,4,5]
- for i in data:
- index_i = data.index(i)
- print(i, data[index_i], i == data[index_i])
- data.remove(i)
- print(i, data[index_i], i == data[index_i])
- print("--------")
- r"""
- >>>
- ======== RESTART: C:\Users\Administrator\Desktop\test.py ========
- 1 1 True
- 1 2 False
- --------
- 3 3 True
- 3 4 False
- --------
- 5 5 True
- Traceback (most recent call last):
- File "C:\Users\Administrator\Desktop\test.py", line 6, in <module>
- print(i, data[index_i], i == data[index_i])
- IndexError: list index out of range
- >>>
- """
复制代码
|
|