人们有时会问:“Python 中有指针吗?”作为一个老年工程师,我本不愿给出那种模棱两可的答案,但这个问题的确取决于你对“指针”的定义。
经典的指针定义是:一种存储其他数据地址的变量,你可以通过它来操作那些数据。用非常宽泛的伪代码表示,大概是这样的:
myvar = SOMETHING;
mypointer = get_address_of(myvar);
print(get_value_via_pointer(mypointer));
## output is SOMETHING
这样的定义非常有用,因为我们可以用指针来引用数据,根据我们所需要的任何逻辑,在代码的某处设置一个指针,用它指向某数据。而后可以在无需了解它所指的具体内容或决策过程的情况下,在别处使用该指针。指针提供的这种间接性让我们能够分离关注点,编写更模块化的代码。
许多编程语言都提供了类似的指针功能。例如,在 C 语言中,
get_address_of()
操作由取址符
&
完成,而
get_value_via_pointer()
操作由解引用符
*
实现,前面的代码片段会写成:
int myvar = 17;
int *mypointer = &myvar;
print_int(*mypointer); // outputs 17
其他如 C++、C#、Go、Rust、Pascal 乃至 Fortran 等语言也具有类似的能力。
那么 Python 呢?从某种意义上说,Python 没有像这样的指针概念。你可以说 Python 的
id()
函数提供了
get_address_of()
功能,因为它至少在 CPython 中返回数据的内存地址:
myvar = 17
mypointer = id(myvar) # ** not useful
但 Python 没有逆操作:没有
get_value_via_pointer()
能让你根据
mypointer
获取到
myvar
。
因此,Python 没有经典的这一对操作来显式地使用指针。但另一方面,Python 中的每个变量都是一个指针,因为 Python 中的变量是对象的引用名。
在Python中,上述简单示例看起来像这样:
myvar = 17
mypointer = myvar
print(mypointer) # outputs 17
当有人问 Python 是否有指针时,或许最好的答案是:它不像其他一些语言那样有显式的指针,但一切隐含地都是指针。所以当你需要时,你拥有指针的力量:你可以拥有多个数据结构,然后将变量赋值为你选择的一个,并在之后使用该变量。这样其实已经实现了指针中的“数据(which data)”与“操作(work with the data)”的分离。
一些语言如 C 还允许指针进行算术运算,以调整数组中一项到另一项的指针。Python 的引用不支持这一点。
Python的标准库提供了ctypes,非常适合与本地 C 代码交互,包括暴露 C 指针在内的细节。但这并不算作 Python 有显式指针的功能。
Pointer In C
Pointers allow you to create great efficiency in parts of your code. They also cause confusion for beginners and can lead to various memory management bugs.
Essentially, they are variables that hold the memory address of an..
在
Python
中,虽然没有显式的
指针
概念(如 C/C++ 中的 ),但所有变量本质上都是对对象的引用(类似于
指针
的抽象)。理解这一点对掌握
Python
的内存管理、参数传递和可变/不可变对象的行为至关重要。当你在
Python
中赋值一个变量时,变量名实际上是一个指向对象的引用(内存地址的抽象)。例如:
和 都指向同一个整数对象 的内存地址。使用 和 可以验证它们指向同一地址。
2. 可变对象与不可变对象
不可变对象(如 )无法在原地修改。重新赋值会创建新对象:
不可变对象 - 常
在
python
中定义一个列表时,我们一定要注意其中的可变对象的原理。虽然
python
的语法中没有
指针
,但是实际上定义一个列表变量时,是把变量名指到了一个可变对象上。如果此时我们定义另外一个变量也指到同一个可变对象的话,就会造成一个“联动”的现象。也就是改变其中的一个值时,另一个值也会随之而改变。本文使用的
Python
版本为
Python
3.7.13
这里我们先定义一个列表a,...
###
Python
中是否存在类似
指针
的概念
Python
是一种高级编程
语言
,其设计哲学强调简洁性和可读性。尽管
Python
并不直接提供像 C 或 C++ 那样的低级
指针
操作功能,但它确实有一些机制可以通过其他方式实现类似的用途。
#### 1. 使用对象引用
在
Python
中,变量本质上是对对象的引用。虽然这些引用不像 C/C++ 的
指针
那样可以直接操纵内存地址,但它们的行为类似于
指针
。例如:
```
python
class Example:
obj = Example()
ref_to_obj = obj # `ref_to_obj` 和 `obj` 指向同一个对象
print(ref_to_obj is obj) # 输出 True 表明两者指向同一对象[^1]
这种行为允许
开发
者通过不同的名称来访问相同的对象实例,从而模拟某些
指针
的功能。
#### 2. 利用 ctypes 库处理底层
指针
对于需要更接近硬件层面的操作场景,
Python
提供了 `ctypes` 库,它能够调用外部共享库并操作原始数据类型以及实际的
指针
。下面是一个简单的例子展示如何创建和使用整型
指针
:
```
python
import ctypes
value = ctypes.c_int(42)
pointer = ctypes.pointer(value)
print(pointer.contents.value) # 访问
指针
对应的内容
pointer.contents.value += 1
print(pointer.contents.value) # 修改
指针
对应的内容
此方法适用于那些必须与现有 C/C++ 代码交互或者执行特定性能优化的任务。
#### 3. 数据结构作为替代方案
当不需要真正意义上的
指针
时,可以考虑采用合适的数据结构代替之。比如字典(dictionary)、列表(list)等容器类型都可以用来保存复杂关系或关联信息。
```
python
data_store = {
'item_a': {'name': 'Item A', 'price': 10},
'item_b': {'name': 'Item B', 'price': 20}
reference = data_store['item_a'] # 创建对 item_a 的引用
print(reference['price']) # 可以通过 reference 来获取 price 值[^3]
上述代码片段展示了利用嵌套字典构建 key-value 存储体系,并且可以从不同位置轻松获得所需子项的方式。
综上所述,在大多数情况下,
Python
不依赖传统意义下的
指针
即可完成
开发
需求;而对于特殊情形,则可通过扩展模块如 `ctypes` 实现必要的控制能力。