【发布时间】:2011-12-16 13:37:23
【问题描述】:
可能重复:
“Least Astonishment” in Python: The Mutable Default Argument
好的,所以基本上我有这个代码:
# Our Rule type.
class Rule(object):
"""An object to represent a rule and include
methods to apply these rules."""
def __init__(self,bind="F",rule=["F"]):
self.bind = bind
self.rule = rule
def show(self):
try:
print self.bind
#print self.rule
for i in range(len(self.rule)):
print self.rule[i]
except:
print "Incomplete"
def inflate(self,seq):
for i in range(len(seq)):
if seq[i] == self.bind:
seq[i] = self.rule
elif type(seq) == type(["X"]):
seq[i] = self.inflate(seq[i])
return seq
def inflate_depth(self,seq,depth):
while depth > 0:
seq = self.inflate(seq)
depth = depth - 1
print self.rule
return seq
我用这个代码从另一个文件调用它:
pity = Rule(rule=["R","F","L","F","L","F","R","F"])
seq = ["F"]
inf = pity.inflate_depth(seq,2)
所以,我最终应该得到一个如下所示的列表:
[['R', [...], 'L', [...], 'L', [...], 'R', [...]]]
这似乎工作正常,但有一个基本错误。
self.rule
已更改为包含['R', [...], 'L', [...], 'L', [...], 'R', [...]]
为什么?没有任何地方可以为该变量分配新值,但它仍然会发生变化。
【问题讨论】:
-
@delnan:在这种情况下,最直接的问题不是默认参数,而是在需要属性值的副本时传递对属性的引用(尽管可变的默认参数也是一个潜在的问题)。