繁体   English   中英

python的函数返回

[英]function return of python

我正在阅读 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在函数之后确实需要一个“返回余额”?

您没有获得任何amount值的原因是因为您的add函数没有返回任何内容。

def add(balance,rate):
    return 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)

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

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

输出:

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

UPS!

您的add函数不会return任何内容,因此 Python 会自动让它在最后返回None 当你写:

amount = add(amount,rate)

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM