所以,基本上,我有一个像这样的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,0] ......]。基本上,第一个值总是相等(对于所有这些值)(和对于其他值,我只是显示它的一部分)。基本上,似乎代码给它们总是相同的值 - 这意味着父母都是相同的,并且都来自同一个补丁。任何人都知道什么我做错了?
答案 0 :(得分:0)
小心使用乘法运算符初始化列表。如果这样做,最终会得到一个包含对同一列表的多个引用的列表。以下是一小段代码:
MemberName
您可以看到list_1中的第一项和第二项实际上是
使用内置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]]
函数的相同对象:
id
改为使用列表理解:
In [5]: for item in list_1:print id(item)
139861322599744
139861322599744