python中的指针

『AI先锋杯·14天征文挑战第9期』 10w+人浏览 82人参与

python中的指针
python中也是存在指针的,只不过平常一般看不到也用不到,被解释器给包装起来了。
这是与C语言的区别之处。

比如运行下面的代码:

a = [1, 2, 3]
b = a          # 不是复制列表,而是把 b 也指向同一块列表对象
b.append(4)
print(a)       # [1, 2, 3, 4]   # 两边同时看到改动

输出结果是 [1, 2, 3, 4]
这是因为变量a,b同时指向一个内存,所以会同步变动。
打个比方说,就好像是一个抽屉,在里面放了[1,2,3],然后a相当于是一把钥匙指向这个抽屉,
后面的b = a相当于是又配了一把钥匙,但是指向的抽屉还是同一个。
b.append(4)相当于是钥匙b打开抽屉放了一个新元素进去,
print(a) 相当于是用钥匙a重新打开抽屉查看,这时候自然会看到[1, 2, 3, 4]

那么,如果我不想让a,b同步变化,该怎么办呢?
可以这样:

a = [1, 2, 3]
b = a.copy()   # 或 list(a)、a[:]、copy.deepcopy(a)
b.append(4)
print(a)       # [1, 2, 3]  原列表没变
print(b)       # [1, 2, 3, 4]

这里的b = a.copy() 就相当于是新开了一个抽屉,自然就不会相互影响了。

还有另外一种情况,也是需要注意的:

a = [] 
b = a 
a = [3] 
print(a,b)

运行这段代码,会输出 [3] []
为什么这时候就不同步了呢?这是因为a = [3] 这个语句就不再是往抽屉里面放东西了,
而是相当于新建了一个抽屉,并把a的箭头给“掰过去”
所以打开b抽屉,还是原来的那个空抽屉,打开a抽屉,就是另一个抽屉了。

最后,还有个小细节,那就是list.append这个函数是属于原地修改列表,而不会返回任何值。
举个例子,

a = [] 
b = a.append(3) 
print(a,b)

运行之后会输出 [3] None
这是因为a.append(3)默认返回None,而不是修改后的列表。
想要把修改后的列表赋值给b的话,这样改动一下就好了:

a = []
a.append(3)
b = a
print(a,b)

这样运行出来就是 [3] [3]了。

Python 作为一种高级编程语言,对指针的概念进行了抽象和封装,因此在语言层面并没有像 C 或 C++ 那样显式支持指针的语法。然而,Python 中依然存在一些与指针行为相似的机制,这些机制在底层实现中依赖于指针,但在语言设计上通过引用、内存操作等方式进行了隐藏和简化。 ### Python 中的指针”行为 Python 中的变量并不直接存储数据,而是存储对对象的引用。这种引用机制在底层实现中本质上就是指针,但 Python 通过自动内存管理和垃圾回收机制隐藏了指针的复杂性。例如,当一个变量赋值给另一个变量时,实际上是将对象的引用复制过去,而不是创建一个新的对象。这与指针的赋值行为非常相似[^2]。 ```python a = [1, 2, 3] b = a # b 是对 a 所引用对象的引用 b.append(4) print(a) # 输出 [1, 2, 3, 4] ``` 在上述代码中,`b` 是对 `a` 所引用对象的一个引用,修改 `b` 会影响 `a`,因为两者指向的是同一个对象。 ### 使用 `ctypes` 实现指针操作 虽然 Python 本身不直接暴露指针操作,但可以通过 `ctypes` 模块实现类似 C 语言指针的行为。`ctypes` 是 Python 的一个外部库,允许调用 C 函数并操作 C 数据类型,包括指针。例如,可以通过 `ctypes.pointer()` 函数创建指向某个变量的指针,并通过指针访问和修改变量的值[^3]。 ```python import ctypes # 创建一个整型变量 x = ctypes.c_int(10) # 创建指向 x 的指针 px = ctypes.pointer(x) # 通过指针访问和修改 x 的值 px.contents.value = 20 print(x.value) # 输出 20 ``` ### 文件指针 在文件操作中,Python 提供了类似于“文件指针”的概念,用于控制文件读写的位置。通过 `seek()` 方法可以移动文件指针,从而实现对文件内容的随机访问。这种方式与指针在内存中的行为类似,只不过它操作的是文件流中的位置[^4]。 ```python with open('example.txt', 'rb') as f: f.seek(0, 0) # 将文件指针移动到文件开头 print(f.read(5)) # 从当前位置读取 5 个字节 ``` ### 总结 尽管 Python 没有显式的指针语法,但其引用机制、`ctypes` 模块以及文件操作中的指针概念都体现了与指针相关的功能。这些特性使得 Python 在保持安全性和易用性的同时,也能在必要时进行底层操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

裤裤兔

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值