私はPython 2.7で問題が発生しています。非常に奇妙なPython変数の範囲の振る舞い
私はいくつかの関数に配列を渡していますが、その変数はローカルになるようにしています。最後に、main内部の変数の値が変更されます。
私はPythonには少し新しいですが、これは私が持っている常識に反するものです。
私が間違っていることのアイデアはありますか?
def mutate(chromo):
# chooses random genes and mutates them randomly to 0 or 1
for gene in chromo:
for codon in gene:
for base in range(2):
codon[randint(0, len(codon)-1)] = randint(0, 1)
return chromo
def mate(chromo1, chromo2):
return mutate([choice(pair) for pair in zip(chromo1, chromo2)])
if __name__ == '__main__':
# top 3 is a multidimensional array with 3 levels (in here I put just 2 for simplicity)
top3 = [[1, 0], [0, 0], [1, 1]]
offspring = []
for item in top3:
offspring.append(mate(top3[0], item))
# after this, top3 is diferent from before the for cycle
UPDATE Pythonは参照によって渡されますので、私はそれらを使用する前に、アレイのfoの本当のコピーを作成する必要があり、そうメイト機能に変更する必要があります:あなたが操作する
import copy
def mate(chromo1, chromo2):
return mutate([choice(pair) for pair in zip(copy.deepcopy(chromo1), copy.deepcopy(chromo2))])
そう短い答えが存在することですPythonでは "変数"はなく、基本的にすべてが参照渡しであることを意味する "名前"だけであり、シーケンス内の項目でさえあります。 –
はい、今変更しました。ありがとう:) – jbssm
@jbssm:また、 'from random import *'を使用しないでください。これは良い理由のために悪い習慣とみなされます。 –