2011-12-19 49 views

回答

3

列表是一个可变对象。从doc

缺省值只计算一次。当默认值是可变对象(如列表,字典或大多数类的实例)时,这会有所不同。

None开始:

def stackdemo(stack=None): 
    if stack is None: 
     stack = [] 
    stack.append('q') 
    return stack 

stackdemo() 
print stackdemo() 
+0

单线程,更清晰的'if'块:'stack = stack或[]' – JCotton 2012-02-29 20:08:19

+0

@JCotton - 这是错误的。想象一下调用'stackdemo(l)',其中'l = []'在之前定义(并在其他地方使用)。 – eumiro 2012-03-01 08:09:02

+0

你是对的,虽然单线可能在OP的情况下工作。它也会出错''stackdemo(mystr)''mystr =“”'或者其他的False值。它取决于'stack'变量的用法和含义。如果None的值具有不同的含义,或者变量可以保存其他有效但是False的值,则不能替代显式的'is None'检查。 – JCotton 2012-03-01 16:41:43

1

在Python变量按对象引用传递,而不是价值。

这意味着,在这种情况下,要修改的stack=[]变量。

如果你想避免这种行为,那么你必须在范围内生成变量,因为在这种情况下它将在运行时生成。

def stackdemo(stack=None): 
    if stack is None: 
     stack = [] 
    ... 
+1

第一行实际上并不正确。阅读[this](http://effbot.org/zone/call-by-object.htm) – JBernardo 2011-12-19 16:43:26

+0

@Jernardo:这是正确的,但取决于你对价值的定义。由于我遗漏了“对象”部分,可能有点不清楚。我会澄清一点:) – Wolph 2011-12-19 17:02:59