Python: pass by object reference

Python: pass by object reference
ExisfarPython: pass by object reference
在 Python 中,“pass by object reference”(也称为“传对象引用”)的意思是:
- 当你把一个对象作为参数传递给函数时,函数获得的是该对象的引用(指向该对象的指针),而非一个独立的拷贝。
- 如果这个对象是可变的(例如列表、字典、NumPy 数组等),在函数中直接修改这个对象(例如对列表的就地修改或者使用 x -= 1),外部也会看到这些变化。
- 但如果在函数内对该参数重新赋值(例如 x = …),这只会改变本地引用的指向,而不会影响外部的变量。
哪些是object reference哪些不是?
Python中的一切都是object,它们都有自己的attribute和method,一切变量都是对object的reference.
在 Python 中,所有变量都实际保存对对象的引用。不过有些对象是可变的(mutable),而有些是不可变的(immutable)。在你的代码中:
-
x (在全局作用域中)
- 这个 x 是一个对 NumPy 数组对象的引用。
- NumPy 数组是可变的,所以对它的原地操作(比如
x -= 1
)会直接改变底层数据。
-
x (函数 test 的参数)
- 当你调用
test(x)
时,函数参数 x 也是一个引用,它指向同一个 NumPy 数组对象。 - 由于这是同一个对象,对 x 进行的原地修改(
x -= 1
)会影响函数外的 x。
- 当你调用
-
数字字面量比如 1、2、3
- 这些数字是不可变对象。
- NumPy 数组内部存储的数字作为数组内容存在,不影响传入函数时对象引用的行为。
简要整理如下:
-
对象引用:
- 全局变量 x(引用一个 mutable NumPy 数组)
- 函数参数 x(同样引用那个 NumPy 数组)
-
不可变对象:
- 数字 1、2、3(作为数组内容存在,但它们本身不可改变)
所以,“pass by object reference”指的是变量传递的是对这些对象的引用,而不是对象的拷贝。在你的例子中,由于传入的是同一个 mutable 对象,函数内的原地操作会对外部对象产生影响。
Comment
匿名评论隐私政策