函数定义外的变量存储+内存中的变量位置?

时间:2014-10-13 14:54:28

标签: python function memory

示例功能:

 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找到它的人

3 个答案:

答案 0 :(得分:3)

list的默认值视为在函数定义时创建,而不是每次调用。因此,相同的列表从第一次和第三次调用返回,因此当最后打印所有值时,将打印相同的(最终)值。正如@johnsharpe指出的那样,如果在两次调用之间打印值,您将看到预期的行为。

答案 1 :(得分:0)

这将清除list1list2

的输出
    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']

它告诉你的是,当你有一个可变的默认参数时,你可以在函数调用期间实际更改它。