我正在阅读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在函数之后确实需要“ return balance”?

===============>>#1 票数: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)

===============>>#2 票数:1

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

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

输出:

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

UPS!

===============>>#3 票数:0

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

amount = add(amount,rate)

add返回None ,因此amount设置为None

另外,并非Python中的所有对象都是可变的,因此从函数内部修改变量将无法实现您的期望。 使用return代替:

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

  ask by Iseng translate from so

未解决问题?本站智能推荐: