我的书中有以下示例,该程序应该是在多个帐户上添加兴趣后计算新余额的程序:
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]?
答案 0 :(得分:2)
实际上,如果未指定返回,则默认返回None
。但是,为什么你会得到其他价值观?因为当你这样做时
balances[i] = balances[i] * (1 + rate)
您正在修改列表balances
的值。
所以,你正在做以下事情:
amounts = [1000, 2200, 800, 360]
addInterest
将列表作为参数传递。在此功能中,您正在修改此列表的内容。您没有返回任何内容,但列表已被修改。答案 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
希望这可以解决任何困惑。