【问题标题】:python: function parameter updating issuespython:函数参数更新问题
【发布时间】:2012-05-10 20:57:09
【问题描述】:

我有一个 python 函数func(A)Anumpy.array 并且可能很大,以至于我会犹豫一遍又一遍地复制它。这个func(A)想改变A的内容。我知道这是一个python新手问题。我以前用C编程,它可以通过指针来完成。如何更改A 的内容,使更改在func(A) 范围之外也有效?

【问题讨论】:

  • 对这个 [this][1] 类似帖子的回复没有回答您的问题吗? [1]:stackoverflow.com/questions/10149416/…
  • 我想我必须声明该参数可能不是全局变量。它可能是一个类的成员。我会尝试,但真正的问题是当我将变量传递给函数时,我真的不知道发生了什么。它是从不复制内容还是python中没有“按引用传递”或“按值传递”之类的东西。在 C 中,指针一开始很难理解,但我理解了,现在,这...
  • 这与全局无关。您可以在很大程度上将所有参数视为在 Python 中通过引用传递。

标签: python numpy


【解决方案1】:

tl;dr 在你的情况下,它基本上已经是。除非您在方法中为标签 A 分配新值,否则 A 将是对您传递的对象的引用,这意味着对 A 的任何修改都会在您使用它的其他任何地方更改原始对象。

例如:

>>> def foo(A):
...     print A[0]
...     A[0] = 2
...     print A[0]
...
>>> a = [0, 1, 2]
>>> foo(a)
0
2
>>> a
[2, 1, 2]
>>> def bar(A):
...     print A[0]
...     A = [0, 1, 2]
...     A[0] = 2
...     print A[0]
...
>>> a = [0, 1, 2]
>>> bar(a)
0
2
>>> a
[0, 1, 2]

【讨论】:

  • +1。换句话说,numpy 数组是可变的。但请注意,某些numpy 函数会返回副本;可能值得说明一些保证会改变而不是复制数组的基本内容。 (即项目分配、就地数学运算等)
  • +1 作为一名 C++ 开发人员,我花了很长时间才用标签而不是变量来围绕 Python 进行思考。互联网上有一个很棒的页面,上面有图片……现在它去了哪里?
  • 我没明白。如何在没有分配的情况下更新数组?实际操作是A=A+k*C k 是标量,C 是本地 numpy.array tl;dr 是什么?
  • @gokhan_ufl: A += k*C 将就地修改A
  • A=A+k*C 将创建一个作为操作结果的新实体,并使A 成为该新对象的标签(大致为引用)。 A+=k*C 将修改原始引用的 A 值。如果我们说a 是方法范围之外的标签并且A 在内部,则A=A+k*C 将不会影响aA+=k*C 将修改a
【解决方案2】:

如果传递给 A 的参数是全局参数,则可以更改参数 A 的值。另一种方法是将变量从函数传递到函数。从 我在 python 中的理解,当你这样做时,对象不会被复制。

【讨论】:

  • 其实A不是全局变量,它是一个类的成员,而func是另一个类的成员。
猜你喜欢
  • 2022-01-07
  • 2017-08-02
  • 1970-01-01
  • 1970-01-01
  • 2019-09-14
  • 2014-03-06
  • 1970-01-01
  • 1970-01-01
  • 2011-01-11
相关资源
最近更新 更多