变量范围如何在此for循环中起作用?

时间:2017-10-03 21:59:10

标签: python variables for-loop scope

我已经尝试了很长时间才发现和/或谷歌自己对此有所回答。在我写的遗传算法中,rand_funcs将为序列中的基因填充适当的随机化函数。在这种情况下,它应该填充两个随机函数:一个生成0到2之间的随机数,另一个生成0到74之间的随机数。

但是,正如您从以下代码和生成的输出中可以看到的那样,结果是两个函数都生成0到2之间的数字。这怎么可能?我甚至尝试在deepcopy上使用max_nr,然后再将其发送给lambda函数创建者。

感谢任何建议!

self.gene_types = ["int74","int2"]
self.sequence_length = len(gene_types)
self.rand_funcs = []
maxnrs = []
for gt in self.gene_types:
    print(gt, file=sys.stderr)
    if gt == "bit":
        self.rand_funcs.append(lambda: random.random() < 0.5)
    elif gt == "float":
        self.rand_funcs.append(random.random)
    elif gt[:3] == "int":
        print("laaaaal", id(gt), gt[3:], file=sys.stderr)
        max_nr = int(gt[3:]) #WHY IS THIS EQUAL TO TWO FOR BOTH AFTER SECOND ITERATION?!?!??!
        maxnrs.append(int(gt[3:]))
        print(maxnrs, max_nr, type(max_nr), id(max_nr), file=sys.stderr)
        print(*map(id, maxnrs), file=sys.stderr)
        if len(self.rand_funcs) >= 1:
            print("meep meep", self.rand_funcs[0](), file=sys.stderr)
            print(*map(id, maxnrs), file=sys.stderr)
        self.rand_funcs.append(lambda: random.randint(0,max_nr))
        print(*map(id, self.rand_funcs), file=sys.stderr)
        for f in self.rand_funcs:
            print("meep", f(), file=sys.stderr)
    else:
        raise ValueError("Unknown gene type")
print(self.rand_funcs[0](), file=sys.stderr)
print(self.rand_funcs[1](), file=sys.stderr)
print("maxes", maxnrs, file=sys.stderr)

这是输出:

int74
laaaaal 140047932053576 74
[74] 74 <class 'int'> 94881069021088
94881069021088
140047869933360
meep 73
int2
laaaaal 140047932053632 2
[74, 2] 2 <class 'int'> 94881069018784
94881069021088 94881069018784
meep meep 2
94881069021088 94881069018784
140047869933360 140047869933496
meep 0
meep 1
2
1
maxes [74, 2]

0 个答案:

没有答案