2016-06-13 110 views
0

我寫了下面的函數來完成列表排列:Python的奇怪行爲功能

def makePermutatedList(original_list,new_list=[]): 
    for _ in range(len(original_list)): 
     new_list.extend(original_list) 
     x=original_list.pop(0) 
     original_list.insert(len(original_list),x) 
    return new_list 

,並將它保存到一個文件名爲my_list_module.py(這本身就是一個包叫做my_modules內)。現在,從另一個文件我導入包/模塊和運行makePermutatedList()

import my_modules.my_list_module 
a=my_modules.my_list_module.makePermutatedList(["jurij","neli","julian"]) 
print a 
b=my_modules.my_list_module.makePermutatedList([1,2,3]) 
print b 

,輸出是:

['jurij', 'neli', 'julian', 'neli', 'julian', 'jurij', 'julian', 'jurij', 'neli'] 
['jurij', 'neli', 'julian', 'neli', 'julian', 'jurij', 'julian', 'jurij', 'neli', 1, 2, 3, 2, 3, 1, 3, 1, 2] 

所有的a也已複製在b內容雖然我已經叫該函數具有不同參數2次。這是爲什麼發生?

編輯

我其實想用makePermutatedList()使聲音文件的矩陣。我現在已經糾正了makePermutatedList()這樣:

def makePermutatedList(original_list,new_list=None): 
    if new_list==None: 
     new_list=[] 
    for _ in range(len(original_list)): 
     new_list.extend(original_list) 
     x=original_list.pop(0) 
     original_list.insert(len(original_list),x) 
    return new_list 

這現在可以按預期的爲我其他的代碼裏面。然而,當我在這個特定的代碼中使用它下面我得到仍處在snd_list_B複製的行

snd_list_B=my_modules.my_list_module.makePermutatedList(snd_list_B) 

後完全snd_list_A任何人任何想法,爲什麼這仍然是怎麼回事?我遠遠沒有考慮這個問題:

sample_paths=["/home/amir/Music/SAMPLESWAP_drum_1/DRUMS and SINGLE HITS/toms/", 
"/home/amir/Music/sounds/4409__pinkyfinger__piano-notes-1-octave/", 
"/home/amir/Music/sounds/pad-snds/", 
"/home/amir/Music/sounds/bongo/"] 
#SOUNDS 
snd_list=[] 
#------------ 
snd_list_A=[] 
snd_list_B=[] 

for snd in os.listdir(sample_paths[0]): 
    snd_list_A.append(sample_paths[0]+snd) 
assert len(snd_list_A)==24,"Wrong number of sound files loaded! I need 24 Sound files!sndlist-0" 
snd_list_A.sort() 
snd_list_A=my_modules.my_list_module.makePermutatedList(snd_list_A) 

#~ print "+++++++++++++++++",snd_list_A,len(snd_list_A) 
for snd in os.listdir(sample_paths[1]): 
    snd_list_B.append(sample_paths[1]+snd) 
assert len(snd_list_B)==24,"Wrong number of sound files loaded! I need 24 Sound files!sndlist-1" 
snd_list_B.sort() 
snd_list_B=my_modules.my_list_module.makePermutatedList(snd_list_B) 

print "========================================================" 
print id(snd_list_B),id(snd_list_A),snd_list_A is snd_list_B 
print "========================================================" 

這將打印:

======================================================================== 
140109723798992 140109723798992 True 
======================================================================== 
+1

['here'(http://docs.python-guide.org/en/latest/writing/gotchas/)它expains發生了什麼 – Praveen

回答

2

此使用可變默認值時,是一個相當普遍的問題。
這是因爲默認參數是在函數創建時計算的,這意味着您的函數將始終使用完全相同的列表對象。

常見的解決方法是這樣的:

def some_function(arg=None): 
    if arg is None: 
     arg = [] 
    # rest of code 
+0

函數創建時間是什麼意思?我第一次調用這個函數時,會有'new_list'設置爲'[]',另一個新的空'new_list'將不會再被創建?是對的嗎? – amirteymuri

+1

不是第一次調用它,而是在執行函數定義時。但是,之後將不會創建一個空列表,現有的列表將被重用。 – stranac

+0

我完全困惑!請在我的問題中看到我的編輯。 – amirteymuri