Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
名单及;Python中的对象复制问题_Python_List_Loops_Duplicates - Fatal编程技术网

名单及;Python中的对象复制问题

名单及;Python中的对象复制问题,python,list,loops,duplicates,Python,List,Loops,Duplicates,我之前问了一个涉及循环和列表的问题,收到了一些很好的反馈。不幸的是,我遇到了一个我自己似乎无法解决的新问题。我为这一大块代码道歉: import random from pprint import pprint petri_dish = [] lst = [y for y in petri_dish if y.status == 1] turn = 1 class Species: #__init__,relocate, fight, and target methods for

我之前问了一个涉及循环和列表的问题,收到了一些很好的反馈。不幸的是,我遇到了一个我自己似乎无法解决的新问题。我为这一大块代码道歉:

import random
from pprint import pprint

petri_dish = []
lst = [y for y in petri_dish if y.status == 1]

turn = 1

class Species:
    #__init__,relocate, fight, and target methods

for n in range(20):
    petri_dish.append(Species(n,0,0,0,0,1))

def reproduce():
    class Offspring(Species):
        pass
    for z in list(petri_dish):
        if z.status == 1 and z.life >= 200:
            petri_dish.append(Offspring('A'+str(z.name),0,0,0,0,1))

def move_around():
    for x in list(petri_dish):
        if turn % 2000 == 0:
            reproduce()
        x.relocate()
        x.target()

while len([y for y in petri_dish if y.status == 1]) > 1:
    turn += 1     
    move_around()

for x in [y for y in petri_dish if y.status == 1]:
    pprint(vars(x))

print turn
这个想法是每隔一定的圈数复制“最强”的细胞。问题是这些细胞被复制的次数太多;如果您将代码运行几次,您肯定也会看到我所指的内容

我的怀疑是,我试图更改一个我正在迭代的列表,或者我在某个地方错误地引用了一个列表,但我无法指出问题所在


我们将非常感谢您的任何帮助。谢谢大家!

我知道这不是OP最初寻找的答案,但这可能是正确的答案,如果OP找到了问题所在,那么他们可能也会认为这是正确的答案

尝试使用断点删除代码。不过,为了便于使用,没有任何东西比得上,而且也很有用。如果您使用的是内置在图形用户界面中的或用于调试的插件,只需设置断点即可

对于您的代码:

  • 安装Ipdb及其依赖项(IPython和c.)
  • 从系统命令行,您可以使用方便的
    ipdb
    脚本

    ~ $ ipdb --help
    
    usage: ipdb.py scriptfile [arg] ...
    ~ $ ipdb species.py args
    > ~\species.py(1)<module>()
    ---> 1 import random
         2 from pprint import pprint
         3
    
    ipdb>
    
  • 在代码中您认为可能存在问题的地方设置一个断点,并逐步解决它

    ipdb> b 67
    Breakpoint 1 at ~\species.py:67
    
  • 您可以使用Python命令并检查没有限制的变量-
    retval
    rv
    ,并且任何
    ipdb
    命令都将返回该
    ipdb
    调用的结果-因此请改用
    vars()['']

  • ipdb
    中的列表理解类似于for循环,因此
    n
    将以iterable长度的倍来逐步完成列表理解

  • 点击回车键重复上一个
    ipdb
    命令。乙二醇

    ipdb> n
    > ~\species.py(67)<module>()
         66
    1--> 67 while len([y for y in petri_dish if y.status == 1]) > 1:
         68     turn += 1
    
    ipdb>
    > ~\species.py(67)<module>()
         66
    1--> 67 while len([y for y in petri_dish if y.status == 1]) > 1:
         68     turn += 1
    
    ipdb>
    > ~\species.py(69)<module>()
         68     turn += 1
    ---> 69     move_around()
         70
    
    ipdb> turn
    2
    
  • 希望你能明白。学习使用调试器比让别人发现你的bug有更多的回报。至少,如果你能确定额外的副本从哪里开始出现,那么你可以问一个更具体的问题,你会得到更好的答案


    快乐编码

    请尝试将您的代码简化为一个。在
    移动
    中,对于培养皿中的每个细胞,您可以调用
    复制
    。在“复制”中,对于培养皿中的每个细胞,向培养皿中添加子代。所以,如果你有20个细胞,它们的状态都是1,寿命大于等于200,那么你将得到20*20=400个后代。这就是你想要的吗?这个想法是,经过一定数量的旋转(例如2000次),培养皿中的任何活细胞(状态=1)和超过200个寿命的细胞将生成一个新细胞。因此,如果在2000圈后,培养皿中还剩下4个活细胞,那么应该还有4个细胞产生,总共产生8个细胞(4个旧细胞,4个新细胞)。@Kevin是正确的。只要试着注释掉第61行,你就会发现它工作得很好,或者试着按照我下面的建议调试代码。@Kevin给了你答案。将断点放在
    move_around()
    中的第63行,当
    turn==2000
    时,您将看到不是只复制一次最强的断点,而是复制两次。使用
    s
    进入
    reproduction()
    ,你会看到你在
    petri_dish
    上循环一次,并复制所有最强的(生命>200)活的(状态==1),但是
    reproduction()
    已经在第61行的循环中,因此它被称为20x,创造了20x的
    后代数量,而不是仅仅一次。QED。我希望您使用了调试器。
    
    ipdb> n
    > ~\species.py(67)<module>()
         66
    1--> 67 while len([y for y in petri_dish if y.status == 1]) > 1:
         68     turn += 1
    
    ipdb>
    > ~\species.py(67)<module>()
         66
    1--> 67 while len([y for y in petri_dish if y.status == 1]) > 1:
         68     turn += 1
    
    ipdb>
    > ~\species.py(69)<module>()
         68     turn += 1
    ---> 69     move_around()
         70
    
    ipdb> turn
    2
    
    ipdb> s
    --Call--
    > ~\species.py(60)move_around()
         59
    ---> 60 def move_around():
         61     for x in list(petri_dish):