我遇到了一个很难解释的问题,因为涉及到很多代码。所以归结为以下问题。
我正在尝试访问功能 foo 之外的 xxx 列表,但是我得到了意想不到的结果。有人可以解释一下原因吗?
这是我创建的用于显示问题的函数:
def foo(xxx = []):
if len(xxx) == 5:
return xxx
xxx += [1]
foo()
return xxx
如果我跑
print foo()
我得到了
[1, 1, 1, 1, 1]
这是我的期望。
但是我希望在foo之外可以访问列表 xxx 。所以,我正在做
xxx = []
print foo(xxx)
print xxx
现在我希望列表 xxx 为
[1, 1, 1, 1, 1]
但是 xxx 是
[1]
这不是我的期望。
有人可以解释原因吗?是否可以访问 foo 之外的正确 xxx ,而无需通过 foo 函数的输出访问它?我想这样做的原因是因为在我的实际代码中,我返回的功能不是在我的函数 foo 中,而是对 xxx 进行更改,我想在 xxx 之后看到< strong> foo 已执行。我可以让该功能每次都返回 xxx ,但这会使我的代码不必要地笨重。但我不确定我是否会损害代码质量。我不知道。请建议哪种方式最好。
由于
答案 0 :(得分:3)
xxx = []
print foo(xxx)
print xxx
在此代码中,您使用在函数外部创建的列表foo()
调用xxx
,名为foo()
。但是在函数内,您正在递归调用不带参数的foo
,因此它修改了在函数定义时由默认参数值的表达式创建的列表。 (重要的是,每次调用函数时都会使用相同的列表,而不为该参数提供值。)
比较在您定义def foo(xxx = None):
if xxx is None:
xxx = []
if len(xxx) == 5:
return xxx
xxx += [1]
foo()
return xxx
之后发生的事情:
def foo(xxx = None):
if xxx is None:
xxx = []
if len(xxx) == 5:
return xxx
xxx += [1]
foo(xxx)
return xxx
......当你这样定义时会发生什么:
{{1}}