更改python中的数组值

更改python中的数组值,python,algorithm,Python,Algorithm,我用Python编写了一个用遗传算法计算函数最大值的代码。这是 当我想更改数组的值时,我得到一个错误: def _crossover_chromosomes(chromosome1,chromosome2): crossover_chrom = Chromosome() for i in range(8): if random.random() >= 0.5: crossover_chrom.get_genes()[0][i] = chromosome

我用Python编写了一个用遗传算法计算函数最大值的代码。这是

当我想更改数组的值时,我得到一个错误:

def _crossover_chromosomes(chromosome1,chromosome2):
   crossover_chrom = Chromosome()
   for i in range(8):
     if random.random() >= 0.5:
        crossover_chrom.get_genes()[0][i] = chromosome1.get_genes()[0][i]
        crossover_chrom.get_genes()[1][i] = chromosome1.get_genes()[0][i]
     else:
        crossover_chrom.get_genes()[0][i] = chromosome2.get_genes()[0][i]
        crossover_chrom.get_genes()[1][i] = chromosome2.get_genes()[0][i]
return crossover_chrom
在本部分中,“for”只运行一次,当它想要更改第五行中的数组值时,退出程序

错误:

    crossover_chrom.get_genes()[0][i] = chromosome1.get_genes()[0][i]
    TypeError: 'str' object does not support item assignment

Python字符串是不可变的。例如,不能有
a='10010110'
和赋值
a[3]='1'
。这就是导致错误的原因。你需要避免使用字符串。改用
bool
数组或
整数数组

比如:

class Chromosome:
  def __init__(self):
    self._genes = [[],[]]
    self._fitness = 0
    self.xd = 0
    self.yd = 0

    xd = random.randint(0,256)
    self._genes[0] = [ int(xd/2**i%2) for i in reversed(range(8))]

    yd = random.randint(0,256)
    self._genes[1] = [ int(yd/2**i%2) for i in reversed(range(8))]

我可能错了,但看看你提供的

crossover_chrom.get_genes()[0]
返回一个字符串。因此,您试图通过索引将新值分配给字符串,因此出现了错误。 如果指定给字符串是您想要的(即在第i个位置更改字符串的单个字符),您可以这样做:

crossover_chrom.get_genes()[0] = "{0}{1}{2}".format(
    crossover_chrom.get_genes()[0][:i],
    chromosome1.get_genes()[0][i],
    crossover_chrom.get_genes()[0][i+1:])
或者,为了清晰起见,最好将值分别分配给临时变量,避免每次调用get_gene函数:

orig_gene=crossover_chrom.get_genes()[0]
new_gene1=chromosome1.get_genes()[0]
#...
orig_gene = "{0}{1}{2}".format(
        orig_gene[:i],
        new_gene1[i],
        orig_gene[i+1:])
否则,您必须将字符串转换为列表(可以通过简单地调用对象上的列表来实现,例如:

list(crossover_chrom.get_genes()[0])

或者通过修改get_genes()返回列表而不是字符串列表。

在python中绕过字符串不变性的方法是重新生成字符串。 以下是将某个索引处的字符更改为大写的示例:

index=3
string="abcdefgh"

string= string[:index]+string[index].upper()+ string[index+1:]
print(string)
这将打印出:

abcDefgh

你不认为“我犯了一个错误”对你解决问题的帮助远不如把错误信息放在你的问题中那么大吗?对不起,我编辑了代码什么是
get_genes()
return specific?它是一个
numpy
array还是任何其他数据类型?看起来你的“array”是一个字符串列表。对于这种编辑,它需要是一个列表列表。我更改了代码,但得到了以下错误:self.\u genes[0]=[int(xd/2**I%2)表示I处于反向(范围(8))]TypeError:“tuple”对象不支持项赋值,tuple是不可变的,与字符串的方式相同:-)。这一定是一张单子。我修好了。对不起,这完全正确!谢谢:)