Python: pass by object reference

Python: pass by object reference

在 Python 中,“pass by object reference”(也称为“传对象引用”)的意思是:

  • 当你把一个对象作为参数传递给函数时,函数获得的是该对象的引用(指向该对象的指针),而非一个独立的拷贝。
  • 如果这个对象是可变的(例如列表、字典、NumPy 数组等),在函数中直接修改这个对象(例如对列表的就地修改或者使用 x -= 1),外部也会看到这些变化。
  • 但如果在函数内对该参数重新赋值(例如 x = …),这只会改变本地引用的指向,而不会影响外部的变量。

哪些是object reference哪些不是?

Python中的一切都是object,它们都有自己的attribute和method,一切变量都是对object的reference.

在 Python 中,所有变量都实际保存对对象的引用。不过有些对象是可变的(mutable),而有些是不可变的(immutable)。在你的代码中:

  1. x (在全局作用域中)

    • 这个 x 是一个对 NumPy 数组对象的引用。
    • NumPy 数组是可变的,所以对它的原地操作(比如 x -= 1)会直接改变底层数据。
  2. x (函数 test 的参数)

    • 当你调用 test(x) 时,函数参数 x 也是一个引用,它指向同一个 NumPy 数组对象。
    • 由于这是同一个对象,对 x 进行的原地修改(x -= 1)会影响函数外的 x。
  3. 数字字面量比如 1、2、3

    • 这些数字是不可变对象。
    • NumPy 数组内部存储的数字作为数组内容存在,不影响传入函数时对象引用的行为。

简要整理如下:

  • 对象引用:

    • 全局变量 x(引用一个 mutable NumPy 数组)
    • 函数参数 x(同样引用那个 NumPy 数组)
  • 不可变对象:

    • 数字 1、2、3(作为数组内容存在,但它们本身不可改变)

所以,“pass by object reference”指的是变量传递的是对这些对象的引用,而不是对象的拷贝。在你的例子中,由于传入的是同一个 mutable 对象,函数内的原地操作会对外部对象产生影响。