python教程—numpy数组是通过引用传递的吗?-Python实用宝典

python教程—numpy数组是通过引用传递的吗?

我遇到的事实是,numpy数组是通过引用在多个位置传递的,但是当我执行以下代码时,为什么foo和bar的行为有区别

我遇到的事实是,numpy数组是通过引用在多个位置传递的,但是当我执行以下代码时,为什么foo和bar的行为有区别

    import numpy as np def foo(arr): arr = arr - 3 def bar(arr): arr -= 3 a = np.array([3, 4, 5]) foo(a) print a # prints [3, 4, 5] bar(a) print a # prints [0, 1, 2]

我使用的是python 2.7和numpy版本1.6.1

回答

在Python中,所有变量名都是对值的引用。

当Python计算赋值时,在左边之前计算右边的值。arr - 3创建一个新的数组;它不会在适当的位置修改arr。

arr = arr - 3使局部变量arr引用这个新数组。它不修改传递给foo的arr最初引用的值。变量名arr被绑定到新的数组arr - 3。此外,arr是foo函数作用域中的局部变量名。一旦foo函数完成,就不再有对arr的引用,Python可以自由地垃圾收集它引用的值。< a href = " https://stackoverflow.com/questions/11585793/are-numpy-arrays-passed-by-reference/11585878?正如Reti43指出的,为了让arr的值影响a, foo必须返回arr,并且必须将a赋给该值:

    def foo(arr): arr = arr - 3 return arr # or simply combine both lines into `return arr - 3` a = foo(a)

相反,arr -= 3 (Python将其转换为对 _iadd__特殊方法的调用)确实修改了arr就地引用的数组。

​Python实用宝典 (pythondict.com)
不只是一个宝典
欢迎关注公众号:Python实用宝典

本文由 Python实用宝典 作者:Python实用宝典 发表,其版权均为 Python实用宝典 所有,文章内容系作者个人观点,不代表 Python实用宝典 对观点赞同或支持。如需转载,请注明文章来源。
0

发表评论