当前位置: 首页 > 面试题库 >

numpy数组是通过引用传递的吗?

翁良弼
2023-03-14
问题内容

我遇到了这样一个事实,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中,所有变量名都是对values的引用。

当Python评估分配时,右侧的评估先于左侧。arr - 3创建一个新数组;它不会arr就地修改。

arr = arr - 3使局部变量arr引用此新数组。它不会修改arr传递给的原始引用的值foo。变量名称arr仅绑定到新数组`arr

3。而且,arrfoo函数范围内是局部变量名。一旦foo函数结束,没有更多的参考arr和Python是免费的垃圾收集值对它的引用。正如Reti43所指出的,为了使arr的值受影响afoo必须返回arra`必须分配给该值:

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

a = foo(a)

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



 类似资料:
  • 问题内容: 我想将我的Swift传递 给引用(这样,当我向添加聊天时,仍指向)。即,当更改长度时,我不希望Swift将两个数组分开。 问题答案: Swift中的结构按值传递,但是您可以使用修饰符来修改数组(请参见下面的答案)。类通过引用传递。和在Swift中实现为结构。

  • 如果我将一个变量传递给一个函数,但将该变量标记为常量,它会自动通过引用传递吗? 测试后:没有,因为它打印不同的内存位置。 没有权利?因为我只能传递一个指向内存位置的指针,而不是真正通过引用。如下所示:在C中通过引用传递 这几乎就是我所做的Java和C#编译器在幕后所做的事情。

  • 问题内容: Javascript是通过引用传递还是通过值传递?这是 Javascript中的 一个示例 :The Good Parts 。我对矩形函数的参数非常困惑。它实际上是,并在函数内部重新定义。没有原始参考。如果我从功能参数中删除它,则内部区域功能将无法访问它。 是关闭吗?但是没有函数返回。 问题答案: 基元按值传递,对象按“引用副本”传递。 具体来说,当您传递对象(或数组)时,您(无形中)

  • 问题内容: 我真的是Swift的新手,我刚刚读到类是通过引用传递的,并且复制了数组/字符串等。 通过引用进行传递是否与在Objective-C或Java中通过“ a”引用进行传递的方式相同,还是通过引用进行正确传递? 问题答案: Swift中的事物类型 规则是: 类实例是 引用类型 (即, 您 对类实例的引用实际上是一个 指针 ) 函数是参考类型 其他一切都是 价值类型 ; “其他所有内容”仅表示

  • 我在做一个leetcode问题(https://leetcode.com/problems/reverse-string/)当一个数组被传递给一个方法时,该方法通过将数组指向一个新创建的数组来改变数组。但我发现调用函数中的数组保持不变?在java中数组是通过引用传递的,所以情况不应该是这样吗? 输出:

  • 问题内容: Go中的地图是否通过值或引用传递? 始终可以将函数定义为以下形式,但这是一个过大的杀伤力吗? 相同的返回值问题。我应该返回指向地图的指针,还是将地图作为值返回? 这样做的目的当然是避免不必要的数据复制。 问题答案: 在此线程中,您将找到答案: Golang:使用地图参考来访问地图 您不需要在地图上使用指针。 映射类型是引用类型,例如指针或切片[1] 如果需要更改会话,可以使用一个指针: