提问人:gus 提问时间:4/28/2023 最后编辑:gus 更新时间:4/28/2023 访问量:104
与不可变对象的参数绑定
Parameter binding with immutable objects
问:
我对斯坦福大学的这篇论文有疑问(我推荐它,我在互联网上找到了它),但出现了一个关于这段代码的问题:
# parameters are passed via binding
def main():
original = [1, 2, 3]
do_your_thing(original)
print('original', original)
# when this function is called, the param_name in do_your_thing
# is "bound" to the same value as original.
def do_your_thing(param_name):
# param_name = variable - is this understading correct?
print(param_name)`
我能想象在幕后会发生这样的事情吗?
param_name = original
如果我的理解是正确的,如果变量是不可变的对象,例如 9800,也会发生同样的情况?
original
这两个问题只是为了尝试理解函数中参数的传递,我不想做一些具体的事情。
答:
0赞
Caleb Keller
4/28/2023
#1
没错!另一种说法是,无论类型如何,函数参数总是通过引用传递的(它比这更微妙,但你可以在这里阅读更多关于它的信息)。如果函数更改了其参数之一,则该更改将在函数外部可见。当然,对于不可变对象,这不是问题,因此对象是通过引用传递还是按值传递并没有真正的区别。
要更好地解释通过引用传递参数与值传递参数之间的区别,请参阅此处的 SO 文章。
评论
0赞
gus
4/28/2023
嗨,@Caleb Keller——“所以对象是通过引用传递还是按值传递并没有真正的区别”——“通过引用”你指的是一个可变对象,“通过值”是一个不可变的对象,或者你的意思是什么?
0赞
Caleb Keller
4/28/2023
通过引用传递对象意味着函数内部的变量名称引用从函数外部传入的同一对象。传递值意味着对象被复制,函数内部的变量名称不引用外部的对象,而只引用它们的副本。对象的可变性对它是否可以通过引用或值传递没有任何影响 - 希望这是有道理的!
0赞
gus
4/28/2023
我明白,我只是在问,因为按值传递和按引用在 python 中并不常见。因此,我的第 2 个问题的答案是肯定的,也就是说,无论它是可变对象还是不可变对象,“正常”赋值是否总是在幕后发生(在本例中)?@Caleb凯勒param_name = variable
0赞
Caleb Keller
4/28/2023
@gustavo 正确,在 Python 中永远不会发生按值传递,但参数总是通过引用传递(技术上是赋值,但这些术语几乎相同),无论传递的对象是可变的还是不可变的。
0赞
gus
4/28/2023
太好了,您为这个“突变与结合/重新结合”问题提供了另一种截然不同的方法,但仍然帮助我确认了我的知识(我的 2 个问题),所以我会将其标记为凯勒@Caleb的最佳答案
评论
original
param_name
do_your_thing
original