与for和if一起工作,但循环似乎不是

2024-10-04 05:20:10 发布

您现在位置:Python中文网/ 问答频道 /正文

所以,基本上,我有一个python 2.7的代码如下:

femalebreeders = [[[0] * 4] * n] * pat
femalebreeders1 = [[[0] * 4] * n] * pat


for y in range(pat):
    for x in range(n):
            Indivmales[y][x] = malebreeders[y][x][0] + malebreeders[y][x][3]
    Fec1[y] = 1 - c * numpy.array(numpy.mean(Indivmales[y]))
    FecMales = numpy.ndarray.tolist(1 + (numpy.array(Indivmales) * b) - (numpy.array(Indivmales) * u))
    Fec = [0 if i < 0 else i for i in Fec1]
    FecPop = numpy.mean(Fec)
    FecCalcF[y] = (Fec[y] * (1 - mf)) / ((Fec[y] * (1 - mf)) + (FecPop * mf))
    FecCalcF2[y] = (Fec[y] * mf) / FecPop
    FecCalcM[y] = (Fec[y] * (1 - mm)) / ((Fec[y] * (1 - mm)) + (FecPop * mm))
    FecCalcM2[y] = (Fec[y] * mm) / FecPop


for x in range(n):
    for y in range(pat):
        if random.random() < FecCalcF[y]:
            z = y
        else:
            z = numpy.random.choice(pat, p=numpy.ndarray.tolist(numpy.array(FecCalcF2)/sum(FecCalcF2)))
        f = random.randrange(n)
        m = random.randrange(n)
        if random.random() < mut:
            if random.random() < 0.5:
                femalebreeders1[y][x][0] = femalebreeders[z][f][0] + \
                                               random.uniform(-1, 1)

一些背景。n是个体数,pat是个体所在的斑块数。FecCalcF和FecCalcF2只是表示个人是否要迁移的变量(假设他们总是迁移到新的补丁)。 所以,我想,为每个个体,分配一个补丁(y)。而且,因为它们总是迁徙,它们的父母来自另一个斑块(z),这取决于每个斑块上个体的繁殖力。 最后,我希望有不同的女性来自不同的补丁。但是,女性繁殖者的值类似于([0.10,0,0,0],[0.10,0,0]。。。。]. 基本上,第一个值对于所有值都是相等的(对于其他值也是一样的,我只是展示了其中的一部分)。基本上,代码似乎总是给它们相同的值——这意味着父代都是相同的,并且都来自同一个补丁。有人知道我做错了什么吗?你知道吗


Tags: innumpyforifrangerandomarraymm
1条回答
网友
1楼 · 发布于 2024-10-04 05:20:10

使用乘法运算符初始化列表时要小心。如果你这样做了,你会得到一个列表,其中包含对同一个列表的多个引用。下面是一个简短的代码示例:

In [1]: list_1 = [[0] * 2] * 2

In [2]: list_1
Out[2]: [[0, 0], [0, 0]]

In [3]: list_1[0][0] = 99

In [4]: list_1
Out[4]: [[99, 0], [99, 0]]

您可以看到列表1中的第一项和第二项实际上是 通过使用内置函数id实现相同的对象:

In [5]: for item in list_1:print id(item)
139861322599744
139861322599744

改为使用列表:

In [6]: list_22 = [[0] * 2 for i in range(2)]

In [7]: list_2
Out[7]: [[0, 0], [0, 0]]

In [8]: list_2[0][0] = 99

In [9]: list_2
Out[9]: [[99, 0], [0, 0]]

相关问题 更多 >