Python列表范围外的函数

时间:2015-10-08 11:21:43

标签: python list function

我遇到了一个很难解释的问题,因为涉及到很多代码。所以归结为以下问题。

我正在尝试访问功能 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 ,但这会使我的代码不必要地笨重。但我不确定我是否会损害代码质量。我不知道。请建议哪种方式最好。

由于

1 个答案:

答案 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}}