名单及;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
脚本
~ $ 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
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
快乐编码 请尝试将您的代码简化为一个。在
移动
中,对于培养皿中的每个细胞,您可以调用复制
。在“复制”中,对于培养皿中的每个细胞,向培养皿中添加子代。所以,如果你有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):