1

我正在阅读 John Zelle 的 Python 编程 2ed Ch6。我遇到了一个概念问题:他的示例代码说:

#addinterest3.py 
def addInterest(balances, rate):
    for i in range(len(balances)):
        balances[i] * (1 + rate)


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


test()

上面的代码

“分配到列表中导致它引用新值。当 Python 进行垃圾收集时,旧值实际上会被清理”

根据这个想法,我尝试了一个 test.py

def add(balance, rate):
    balance = balance * (1 + rate)


def test():
    amount = 1000
    rate = 0.5
    amount = add(amount, rate)
    print(amount)


test()

我认为余额也可以通过新值分配,但结果在我的终端中返回“无”。谁能解释它们之间的根本区别是什么?为什么列表赋值不需要使用return来传递值但仍然会被保存,另一方面,我的test.py在函数之后确实需要一个“返回余额”?

4

3 回答 3

1

你没有得到任何价值的原因amount是你的add函数没有返回任何东西。

def add(balance,rate):
    return balance = balance*(1+rate)

将返回一个将分配给 的值amount

除此之外,开始的代码是错误的。如果您要在 python 中尝试此代码,您会发现它会打印出来:

[1000, 2200, 800, 360]

它需要更改为:

def addInterest(balances,rate):
    for i in range(len(balances)):
        balances[i] = balances[i]*(1+rate)
于 2013-04-16T01:49:07.667 回答
1

正如我所料,如果你将一个列表作为函数参数传递,它就像你传递这个列表上的指针一样。Python 中的赋值语句不复制对象,它们在目标和对象之间创建绑定。因此,如果您更改函数内的列表,您可以看到这些更改。如果您传递变量,则这些变量的副本将在函数内部使用。
作为示例,您还可以尝试以下代码:

a = [1, 2]
b = a
a.append(3)
print a, b

输出:

[1, 2, 3] [1, 2, 3]

UPS!

于 2013-04-16T02:56:34.077 回答
0

你的add函数没有return任何作用,所以 Python 会自动让它None在最后返回。当你写:

amount = add(amount,rate)

add返回None,所以amount设置为None

此外,并非 Python 中的所有对象都是可变的,因此从函数内部修改变量不会达到您的预期。改用return

def add(balance,rate):
    return balance * (1 + rate)
于 2013-04-16T01:47:28.697 回答