python有没有指针

Python014

python有没有指针,第1张

如果您曾经使用过C或C ++等低级语言,那么您可能已经听说过指针。指针允许您在部分代码中创建高效率。它们也会给初学者带来困惑,并且可能导致各种内存管理错误,即使对于专家也是如此。那么在Python中有指针的存在吗?

指针广泛用于C和C ++。本质上,它们是保存另一个变量的内存地址的变量。有关指针的更新,可以考虑在C指针上查看此概述。

为什么Python没有指针?

实际上指针为何不存在的原因现在还不知道,也许指针违背了Python的禅宗。指针鼓励隐含的变化而不是明确的变化。但通常情况下,它们很复杂而不是很简单,特别是对于初学者。更糟糕的是,当他们用指针指向自己的方法,或做一些非常危险的事情,比如从你无法获取的的一些变量中读取数据。

Python更倾向于尝试从用户那里抽象出内存地址来实现具体细节,所以Python通常关注可用性而不是速度。因此,Python中的指针并没有多大意义。但是在有些情况下,Python会为您提供使用指针的一些好处。

想要理解Python中的指针,需要理解Python实现指针功能的具体细节。简单来说,需要了解这些知识点:

不可变对象和可变对象【Python中的对象】

Python变量/名称【Python中的变量】

【在Python中模拟实现指针】

相向双指针有这么几大类题型:

相向双指针的核心思想是利用问题和数组的特殊性质,减少搜索的空间,时间复杂度可以从O(/p3.toutiaoimg.com/origin/tos-cn-i-qvj2lq49k0/60a80b0358604247a4d2ab43436150e3","uri":"","width":21,"height":28,"darkImgUrl":"https://p3.toutiaoimg.com/origin/tos-cn-i-qvj2lq49k0/632cd0b3deb44f0986f66e98fe8df9c3","darkImgUri":"","formulaImgStatus":"succeed"}" class="syl-plugin-formula"> )减少到O(/p3.toutiaoimg.com/origin/tos-cn-i-qvj2lq49k0/dcab1cf35bda4a029784117c170e7d57","uri":"","width":13,"height":28,"darkImgUrl":"https://p3.toutiaoimg.com/origin/tos-cn-i-qvj2lq49k0/9ccd650b3d5b4a5bb0993639e2a950bf","darkImgUri":"","formulaImgStatus":"succeed"}" class="syl-plugin-formula"> )。比如在2sum系列里,由于有序数列的性质,当2sum大于目标值,右指针不可能和左指针右边的数配对了,所以右指针减一,减少搜索范围。

现在我们讨论两道灌水题:

解法基于著名的短板原理: 一只木桶盛水的多少,并不取决于桶壁上最高的那块木块,而是取决于桶壁上最短的那块。

最开始我们把双指针指向开头和结尾。因为最低木板决定水位,所以双指针中高位指针向里的所有位置和低位指针形成的水量都小于当前双指针。因此我们未来可以不用理会当前低位指针,下一步将其向里推进。

这道题有多种解法,最优解法是相向双指针。基于短板原理,首先我们要明确基本公式:

和上面类似,我们总是向里移动低位指针进行遍历。

Time complexity: O(n)Space complexity: O(1)

这玩意太难排版,凑合吧

c 的调用方式如下

void test(char**p, int* len)

char* p = malloc(0x1000)

int len = 0x1000

test(&p, &len)

DebugPrint("size is %d ", len)

DumpHex(p, len)

python 呼叫test

func = CDLL('path').test

functype = CFUNCTYPE(c_void, c_void_p, c_void_p)

func = functype(CDLL('path').test)

data = create_string_buffer(0x1000)

len = c_uint64(0x1000)

func(byref(c_int64(addressof(data))), byref(len))  # 如果32位机器的话data 的地址转化为c_int32

data = data[:len.value] # 将字节码重新组装。 data 本身存储的是c_array_0x1000 . 不是python 的bytes类型。

ctypes pyobjc 这种库自身做了一个桥接。 很多虽然python能访问的类型,并不是python原生的类型。

需要很细心的转化为原生类型后,就大胆的使用吧。