为什么在没有返回调用时此函数会返回一个值?

时间:2015-07-15 19:00:59

标签: python python-3.x

我的书中有以下示例,该程序应该是在多个帐户上添加兴趣后计算新余额的程序:

def addInterest(balances, rate):
    for i in range (len(balances)):
    balances[i] = balances[i] * (1 + rate)


def test():
    amounts = [1000, 2200, 800, 360]
    rate = 0.05
    addInterest(amounts, rate)
    print(amounts)


test()

输出为[1050.0,2310.0,840.0,378.0]

addInterest结尾没有回复,所以 为什么不打印(金额)只是初始定义的打印金额,即[1000,2200,800,360]?

3 个答案:

答案 0 :(得分:2)

实际上,如果未指定返回,则默认返回None。但是,为什么你会得到其他价值观?因为当你这样做时

balances[i] = balances[i] * (1 + rate)

您正在修改列表balances的值。

所以,你正在做以下事情:

  1. 声明列表amounts = [1000, 2200, 800, 360]
  2. 调用函数addInterest将列表作为参数传递。在此功能中,您正在修改此列表的内容。您没有返回任何内容,但列表已被修改。
  3. 您打印修改后的列表并显示新值。

答案 1 :(得分:1)

因为列表是可变的,balances[i] = balances[i] * (1 + rate也修改了amounts的值,这是通过调用addInterest(amounts, rate)传递的

因此addInterest()在这种情况下具有隐式返回值。

答案 2 :(得分:1)

请参阅此帖子关于data model,特别是关于可变性的部分。

以下是列表如何可变的示例

>>> arr = [1,2,3]
>>> arr[0] = 99
>>> print(arr)
[99, 2, 3]

当您调用addInterest函数时,将amounts数组作为参数传递,它会修改该数组。这是另一个展示如何发生的例子

def test(my_list):
    print(my_list)
    my_list[0] = 99
    print(my_list)

现在在口译员中进行测试

>>> arr = [1,2,3]
>>> x = test(arr)
[1,2,3] 
[99, 2, 3]
>>> arr
[99,2,3]
>>> x
>>> x is None
True

所以你可以看到,函数的返回值是None,我们将其存储在名为x的变量中。但该函数还有一个副作用,用于更改传递给它的列表arr的值。

最后,让我们看一个像你这样的例子,其中数组是在函数内部定义的。

def change_list(l):
    print(l)
    l[0] = 99
    print(l)


def test():
    arr = [1,2,3]
    change_list(arr)

并在翻译中查看

>>> x = test()
[1, 2, 3]
[99, 2, 3]
>>> x
>>> x is None
True

希望这可以解决任何困惑。