【问题标题】:What's the correct way to pass by reference [closed]通过引用传递的正确方法是什么[关闭]
【发布时间】:2017-07-19 16:41:20
【问题描述】:

我看到其他人问过一个问题,但我看到的唯一答案只是简单地解释了 python 没有像 C 这样的语言相同的按引用传递和按值传递的概念。 例如

    x=[0]
    def foo(x):
        x[0] += 1

过去,我一直在使用这项工作,但它似乎非常不符合 Python 风格,所以我想知道是否有更好的方法来做到这一点。 让我们假设由于任何原因返回值不起作用,例如此代码在单独的线程上运行的情况。

【问题讨论】:

  • 这并不是说您不能technically hack Python 始终“通过引用传递”。顺便提一句。在这些术语中,Python 总是通过引用传递(reference 对 Python 来说是一个模糊的概念),只是某些属性是可变的,而另一些则不是——非可变属性利用写时复制, tho, 所以你会产生他们没有通过引用传递的错觉。
  • Python 使用“按对象传递”,因此按引用传递或按值传递都不适用。您也可以使用生成器等技术。 stackoverflow.com/questions/27034395/…
  • 这看起来像XY problem。你不需要通过引用传递任何东西,你需要一个atomic counter
  • @EricDuminil 抱歉,这不是 XY 问题,我仅包含该代码以帮助说明问题。我对 SO 有点陌生,如果您对如何更好地提出问题有所了解,以便这种区别更加明显,请编辑
  • 没有通过引用传递。你认为那些告诉你 Python 不支持通过引用传递的人是在骗你吗?

标签: python


【解决方案1】:

一些 python 对象是不可变的(tupleintfloatstr 等)。正如您所指出的,您不能就地修改这些。

最好的解决方法是不要尝试伪造通过引用传递,而是应该分配结果。这更易于阅读且不易出错。

在你的情况下,你可以打电话:

x = 0
def f(x):
    return x + 1

x = f(x)

如果您确实需要伪造按引用传递(我不明白您为什么需要这样做),您的解决方案可以正常工作,但请记住,您实际上并没有修改对象。

x = 0
x_list = [x]
print(id(x_list[0]))  # 1844716176

def f(x_list):
    x_list[0] += 1

f(x_list)
print(x)  # 0,  not modified
print(id(x_list[0]))  # 1844716208

【讨论】:

  • 我正在寻找不涉及返回值的解决方案。我编辑了问题以反映这一点
  • 问题是任何不涉及返回值的解决方案都是非 Python 的,基本上是 hack。
  • 真正的用例是试图在两个线程之间共享一个变量,所以如果你有更好的想法会有所帮助
  • @JonasAdler:这对我来说看起来像 Pythonic:stackoverflow.com/a/35088370/6419007
  • 该链接有何相关性?没有函数调用。
猜你喜欢
  • 2014-04-28
  • 1970-01-01
  • 2020-09-20
  • 2021-07-29
  • 2012-04-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多