与不可变对象的参数绑定

Parameter binding with immutable objects

提问人:gus 提问时间:4/28/2023 最后编辑:gus 更新时间:4/28/2023 访问量:104

问:

我对斯坦福大学的这篇论文有疑问(我推荐它,我在互联网上找到了它),但出现了一个关于这段代码的问题:

# 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)`
  1. 我能想象在幕后会发生这样的事情吗?param_name = original

  2. 如果我的理解是正确的,如果变量是不可变的对象,例如 9800,也会发生同样的情况?original

这两个问题只是为了尝试理解函数中参数的传递,我不想做一些具体的事情

python 函数 参数 不可变性 可变

评论

0赞 chepner 4/28/2023
是的,这正是发生的事情。的值作为调用过程的一部分绑定到名称。可变性完全不会影响赋值过程。originalparam_namedo_your_thing
0赞 chepner 4/28/2023
你会想读 nedbatchelder.com/text/names.html
0赞 gus 4/28/2023
嗨@chepner - 就在这几天,我也读了那篇文章,但我想确认我是否理解了它(这是非常令人困惑的东西)。所以,如果是一个不可变的对象(问题 2),同样的事情也会在幕后发生,对吧?original
0赞 chepner 4/28/2023
是的。另一种看待它的方式是,对象的类型实际上并没有指定它是否可变:这完全由对象上可用的方法定义,并且在分配给名称期间涉及/调用/等方法。
0赞 gus 4/28/2023
太好了,现在我很清楚@chepner

答:

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的最佳答案