首页 > 解决方案 > 在 Python 中将参数传递给函数后的行为差异

问题描述

对于下面的这段代码:

def add_minor(person):
    person.append('math')
def switch_majors(person):
    person=['physics']
    person.append('economics')
John=['computer_science']
Tim=John
add_minor(Tim)
switch_majors(John)
print(John, Tim)

有人可以解释为什么输出是:

['computer_science', 'math'] ['computer_science', 'math']

“约翰”怎么没换专业?

另外,对于下面两段代码:

a=[3,4]
b=[6,7]
def do_stuff(a,b):
    a+=[5]
    b+=[8]
    return a,b
do_stuff(a,b)

a=3
b=5
def do_stuff(a,b):
    a+=1
    b+=2
    return a,b
do_stuff(a,b)

为什么 a 和 b 的值在 do_stuff 函数中在它们是列表时会发生变化,但在它们是数字时不会发生变化?

最后,为什么下面的代码返回 None 值?

a=[3,4]
b=[6,7]
def do_stuff(a,b):
    return(a.append(6), b.append(8))
do_stuff(a,b)

谢谢

标签: pythonfunction

解决方案


def add_minor(person):
    person.append('math')

这里的人没有变异,你调用append作为参数传递的对象,解释为什么 Tim 被修改

def switch_majors(person):
    person=['physics']
    person.append('economics')

在第一行之后, person 指的是一个全新的对象 ( ['physics'])。当您追加economics到数组时,它是被修改的新对象,John作为参数传递的初始值保持不变。

更全局地,修改参数的值(如 a += 6)不会在函数范围之外修改它,这解释了为什么 append 在函数中起作用:它不修改变量,而是修改对象的内部状态(即列表元素)

最后 :

a=[3,4]
b=[6,7]
def do_stuff(a,b):
    return(a.append(6), b.append(8))
do_stuff(a,b)

do_stuffreturn (None,None) 因为a.append(6)两者b.append(8)都返回 None,这是正常行为,因为 append 方法不返回任何内容


推荐阅读