【问题标题】:Python strange function behavior [duplicate]Python奇怪的函数行为[重复]
【发布时间】:2016-06-13 09:51:27
【问题描述】:

我编写了以下函数来进行列表排列:

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
========================================================================

【问题讨论】:

  • here 它解释了正在发生的事情

标签: python list python-2.7 function


【解决方案1】:

这是使用可变默认值时非常常见的问题。
发生这种情况是因为默认参数是在函数创建时评估的,这意味着您的函数将始终使用完全相同的列表对象。

常见的解决方法是:

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

【讨论】:

  • 函数创建时间是什么意思?我第一次调用该函数时,将有一个 new_list 设置为 [] 并且永远不会再创建另一个新的空 new_list?对吗?
  • 不是第一次调用,而是函数定义执行的时候。但是,是的,之后不会创建一个空列表,而是重复使用现有的。
  • 我完全糊涂了!请在我的问题中查看我的编辑。
猜你喜欢
  • 2021-02-21
  • 2017-01-14
  • 1970-01-01
  • 2016-01-26
  • 2014-03-08
  • 1970-01-01
  • 2015-10-24
  • 1970-01-01
  • 2016-07-03
相关资源
最近更新 更多