我遇到了一個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中沒有「變量」,只有「名字」,這基本上意味着一切都是通過引用,甚至序列中的項目。 – 2011-12-31 00:56:45
是的,我現在改變了。謝謝:) – jbssm 2011-12-31 00:57:42
@jbssm:另外,請不要使用'from random import *'。出於充分的理由,這被認爲是不好的做法 – 2011-12-31 00:59:50