python - 在 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)
谢谢
解决方案
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_stuff
return (None,None) 因为a.append(6)
两者b.append(8)
都返回 None,这是正常行为,因为 append 方法不返回任何内容
推荐阅读
- javascript - 如何配置在顶部或底部图表中显示标签堆叠条形图进程栏 100%
- logout - Identity Server 3:允许单会话注销的并发用户会话
- javascript - AJAX 调用失败,jqXHR 状态为 0
- visual-studio-2017 - 如何将 .netcore sdk 从 2.1.504 降级到 2.1.4,因为服务器只能托管 sdk 2.1.4
- angular - 角度延迟加载是否编译所有内容,或者在加载时
- reactjs - 在 map 函数中渲染会导致 JsLint 错误,正如预期的赋值或函数调用,而是看到一个表达式?
- javascript - 注册模式限制
- c# - Application.Quit() 需要很长时间才能重新打开应用程序(Unity2D)
- r - 传播不同的列表列
- c# - 获取 Html.DropDownList 的值