循环执行问题
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这一步,
哪位前辈帮忙解答一下,这是为什么呀? 本帖最后由 灰晨 于 2021-6-10 16:54 编辑
虽然你问得有点看不懂,不过你这代码我感觉一个地方有点问题,你的问题可能就是这个原因。当check == step的时候,你重置了check = 0,但是你循环没有停下来,没跳出去,比如你n=20,step=15,那么lst就是1-20,第一轮check == step时,15号没了,这时循环for i in lst没停会继续,因为15号没了,此时16号占了15号的位置,所有是会从17号继续循环,同时这时check = 1,即当重新lst重新从1号开始循环时,check已经等于5了。
好像知道你的问题,for i in lst时,你删了一个数,后一个数前进了一位,如上面所说15号没了,16号前进了一位成为第15个数,而第15个数for i in lst认为已经遍历过了,会继续遍历第16个数,而此时第16个数已经不是16了,而是17. 灰晨 发表于 2021-6-10 16:21
虽然你问得有点看不懂,不过你这代码我感觉一个地方有点问题,你的问题可能就是这个原因。当check == step ...
你的意思是列表会自动补位?拿掉一个数,然后 后边的自动补齐空缺位,访问下一个数,其实是跳过一位数了。 本帖最后由 qq1151985918 于 2021-6-11 08:33 编辑
def ysf(n, step, stop):
lst = list(range(1, n+1))
check = 0
while len(lst) > stop:
lst1 = lst[:]
for i in lst1:
if len(lst) == stop:
break
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)
qq1151985918 发表于 2021-6-11 08:27
我也看到了这一步,用复制的方法,但是我还是不能理解,复制的列表不是一样吗?
同样是先移除,然后复制,复制的结果不是和在原列表操作时一样的吗? 本帖最后由 qq1151985918 于 2021-6-11 09:08 编辑
江湖散人 发表于 2021-6-11 08:46
我也看到了这一步,用复制的方法,但是我还是不能理解,复制的列表不是一样吗?
同样是先移除,然后复制 ...
当你移除列表一个元素的时候,这个列表的索引值就已经发生变化了,删除的元素位置由后边的元素顶替,所以会出现遍历列表但是会出现遗漏的情况,所以我们一般对原列表的副本进行遍历。不止是列表,所有可变化的容器类可迭代对象(列表、集合、字典等)都有这个特点
参考小案例
data =
for i in data:
index_i = data.index(i)
print(i, data, i == data)
data.remove(i)
print(i, data, i == data)
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, i == data)
IndexError: list index out of range
>>>
"""
qq1151985918 发表于 2021-6-11 08:54
当你移除列表一个元素的时候,这个列表的索引值就已经发生变化了,删除的元素位置由后边的元素顶替,所 ...
谢谢,原来如此!
页:
[1]