Python 为什么这个 for 循环会无限循环? [重复]

问题描述 投票:0回答:1

我的循环无限循环,我不明白为什么会发生这种情况 循环似乎永远循环

循环是:

def process_projectiles():
    tmp = projectile_idx
    projectile_idx.clear

    for i in tmp:
        #print(i)
        # Delete too old

        if i[6] > tick - 100:

            b = degtorad(i[2])
            pos = move(i[0],b,i[2])

            speed = i[1]
            direction = i[2]
            sprite = i[3]
            size = i[4]
            damage = i[5]
            b = i[6]
            projectile_type = i[7]
                
            projectile_idx.append([pos,speed,direction,sprite,size,damage,b,projectile_type])

projectile_idx 是:

[[<Vector2(544, 360)>, 5, 282, '0127', 44.8, 10, 42, 'Purpball']]

并由以下方式生成:

        a = (player_pos.x + (screen.get_width() // 2)) - cam_pos.x
        b = (player_pos.y + ((screen.get_height() // 2)- tilesize // 1.42)) - cam_pos.y
        c = math.floor(angle_between_points((a,b),cur_pos))

        if c <= 180:
            pos.x += tilesize*2.5
        elif c > 180:
            pos.x += tilesize*-1.5
        direction = c

        # TO-DO Implement in a more long term solution
        speed = 5
        size = tilesize * 0.7
        sprite = "0127"
        damage = 10
        projectile_type = "Purpball"

        projectile_idx.append([pos,speed,direction,sprite,size,damage,tick,projectile_type])

我正在尝试循环 tmp 中的平均列表。 我尝试使用 while 循环进行循环,但每次调用函数时它都会爆炸到一个疯狂的数字。

感谢您提前的帮助

python for-loop
1个回答
0
投票

看来问题出在你的循环逻辑上。

我们来分析一下:

tmp = projectile_idx
projectile_idx.clear

for i in tmp:
    ...

在此循环中,您将迭代 tmp,它被分配了对projectile_idx 的引用。然后清除projectile_idx,但由于tmp保存对projectile_idx的引用,因此清除projectile_idx也会清除tmp。因此,tmp 变成一个空列表,并且循环无限期地继续,因为没有可以迭代的元素。

要解决此问题,您需要复制projectile_idx,以便对projectile_idx的更改不会影响tmp。您可以使用复制模块来实现此目的:

import copy

def process_projectiles():
    tmp = copy.deepcopy(projectile_idx)

    for i in tmp:
        ...

这样,tmp 会保存一份单独的projectile_idx 副本,清除projectile_idx 不会影响tmp。

© www.soinside.com 2019 - 2024. All rights reserved.