示例功能:
def extendList(val, list=[]):
list.append(val)
return list
list1 = extendList(10)
list2 = extendList(123,[])
list3 = extendList('a')
print "list1 = %s" % list1
print "list2 = %s" % list2
print "list3 = %s" % list3
我一直在审查一些python面试问题,似乎我错过了一些基本的东西。对于上面的脚本/函数,我最初希望看到以下输出,原因在于注释:
list1 = [10] #because default is currently []
list2 = [123, []] #because not using function default of list
list3=[10, 'a'] #because function default list has had 10 appended
相反,list1的结果是:
list1 = [10, 'a'] #I don't understand.
似乎我错过了变量在从内存中的函数传回时会发生什么变化?似乎list1从函数传回时将变量指向默认函数' list'内存中的参数。然后,这个默认功能列表'参数随着list3的调用而改变。最后,当打印list1和list3值时,它们指向内存中的同一变量,从而打印出相同的结果?我在这里方式吗?
想想我在这里回答了我自己的问题......
当检出变量的存储器地址时,我收到以下内容:
print(hex(id(list1))) =
0x10b49a518
print(hex(id(list2))) =
0x10b49a758
print(hex(id(list3))) =
0x10b49a518
有人可以确保我正确地解释了这一点吗?另外,我将这个问题留给任何通过我可怕的标题XD找到它的人
答案 0 :(得分:3)
将list
的默认值视为在函数定义时创建,而不是每次调用。因此,相同的列表从第一次和第三次调用返回,因此当最后打印所有值时,将打印相同的(最终)值。正如@johnsharpe指出的那样,如果在两次调用之间打印值,您将看到预期的行为。
答案 1 :(得分:0)
这将清除list1
和list2
list1 = extendList(10)
print list1
list2 = extendList(123,[])
list3 = extendList('a')
print list3
而在list2
的情况下,您将另一个列表对象传递给list
变量。
答案 2 :(得分:0)
这是一个经典实验。
以下是您可以更清楚地看到事情的方法,我认为上述答案并没有指出究竟发生了什么。
用
替换你的功能def extendList(val, list=[]):
list.append(val)
print inspect.getargspec(extendList).defaults[0] #This prints the default value of list
return list
然后让我们来看看
list1 = extendList(10) #Prints [10]
list2 = extendList(123,[]) #Prints [10]
list3 = extendList('a') #Prints [10, 'a']
它告诉你的是,当你有一个可变的默认参数时,你可以在函数调用期间实际更改它。