我写了以下函数来做列表排列:
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_A,正好在行
之后snd_list_B=my_modules.my_list_module.makePermutatedList(snd_list_B)
有谁知道为什么还会这样?我没想到它:
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
========================================================================
答案 0 :(得分:2)
使用可变默认值时,这是一个非常常见的问题 这是因为默认参数是在函数创建时计算的,这意味着你的函数将始终使用完全相同的列表对象。
常见的解决方法如下:
def some_function(arg=None):
if arg is None:
arg = []
# rest of code