Python 使用for和if,但循环不';好像不行
因此,基本上,我有一个python 2.7的代码,如下所示:Python 使用for和if,但循环不';好像不行,python,if-statement,for-loop,Python,If Statement,For Loop,因此,基本上,我有一个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 -
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)
femaleeders=[[0]*4]*n]*pat
女性繁殖者1=[[0]*4]*n]*pat
对于范围内的y(pat):
对于范围(n)内的x:
Indivmales[y][x]=雄性繁殖者[y][x][0]+雄性繁殖者[y][x][3]
Fec1[y]=1-c*numpy.array(numpy.mean(Indivmales[y]))
fecmeans=numpy.ndarray.tolist(1+(numpy.array(Indivmales)*b)-(numpy.array(Indivmales)*u))
Fec=[0如果i<0,则为0,否则为Fec1中的i]
FecPop=单位平均值(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
对于范围(n)内的x:
对于范围内的y(pat):
如果random.random()
一些背景。n是个体数,pat是个体所在的斑块数。FecCalcF和FecCalcF2只是表示个人是否要迁移的变量(假设他们总是迁移到新补丁)。
所以,我想为每个个体分配一个补丁(y)。而且,由于它们总是迁移,它们的父母来自另一个斑块(z),这取决于每个斑块上个体的繁殖力。
最后,我想让不同的女性来自不同的地方。但是,女性繁殖者的值类似于([0.10,0,0,0],[0.10,0,0,0]…)。基本上,第一个值对所有繁殖者都是相等的(其他值也是一样的,我只是展示了其中的一部分).基本上,代码似乎总是给它们相同的值-这意味着父对象都是相同的,并且都来自同一个补丁。有人知道我做错了什么吗?使用乘法运算符初始化列表时要小心。如果这样做,则会得到一个包含对同一列表的多个引用的列表。下面是一个简短示例以代码位为例:
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]]
使用乘法运算符初始化列表时要小心。如果使用乘法运算符初始化列表,则会得到一个包含对同一列表的多个引用的列表。下面是一段简短的代码示例:
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]]
你在哪里初始化
femalebreaders
?看起来你可能使用相同的引用实现了所有列表,因此更改一个列表将更改所有列表我在循环外初始化femalebreaders,定义如下:femalebreaders1=[[0]*4]*n]*pat
4是因为有4个等位基因提示您的问题,并在代码中添加您初始化的可能重复的代码,用列表理解替换所有的*
。因此,对于范围内的i(n)来说是[[0]*4]对于范围内的j(pat)]
你在哪里初始化女性繁殖者
?看起来你可能使用相同的引用实现了所有列表,因此更改一个列表将更改所有列表我在循环外初始化女性繁殖者,其定义如下:女性繁殖者1=[[[0]*4]*n]*pat
4是因为有4个等位基因提示您的问题并添加代码,在代码中您可以使用列表理解替换所有的*
。因此,对于范围内的i(n)],这将是[[0]*4]对于范围内的j(pat)]