怎么在Python中模拟实现指针

  介绍

怎么在Python中模拟实现指针?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。

<强>在Python中模拟实现指针

因为Python中的指针本身不存在,但并不意味着无法使用指针。实际上有多种方法可以在Python中模拟指针。

这里用两种方法来实现:

<强>使用可变类型作为指针【Python中的变量】

<强>使用自定义Python对象【Python中的对象】

<强>使用可变类型作为指针

您已经了解了可变类型,因为这些对象是可变的,所以您可以将它们视为指向模拟指针行为的指针。假设您要复制以下c代码:

void , add_one  (int , *, x ), {,   ,,,*,x , +,=,, 1,,,   }

此代码采用指向整数(* x)的指针,然后将该值递增1。这是一个练习代码的主要功能:

# include  & lt; stdio.h>   int 主要(空白),{   ,,,int  y =, 2337;   ,,,printf (“y =, % d \ n",, y);   ,,,add_one(及y);   ,,,printf (“y =, % d \ n",, y);   ,,,return  0;   }

在上面的代码中,分配2337给y,打印出当前值,将值递增1,然后打印出修改后的值。执行此代码的输出如下:

y =, 2337,   y  2338=,

在Python中复制此类行为的一种方法是使用可变类型。考虑使用列表并修改第一个元素:

在祝辞祝辞,def , add_one  (x ):   ,,,,,,x  [, 0],, +,=,, 1,   ……,   在祝辞祝辞,y ,=,, (, 2337),   在祝辞祝辞,add_one  (y )   在祝辞祝辞,y  (, 0),   2338年

在这里,add_one (x)访问第一个元素并将其值增加1。使用一种方列表法,最终结果似乎已修改了该值,那么Python中的指针确实存在吗?好吧,这是唯一可能的,因为它列表是一种可变类型。如果您尝试使用一个元组,则会收到错误消息:

在祝辞祝辞,z =,(2337年)   在祝辞祝辞,add_one (z)   Traceback  (most  recent  call 最后一个):   File 才能“& lt; stdin>“, line  1,拷贝& lt; module>   File 才能“& lt; stdin>“, line  2, add_one拷贝   TypeError: & # 39;元组# 39;,object  does  not  support  item 任务

上面的代码演示了这元组是不可变的。因此,它不支持项目分配.list不是唯一可变的类型。在Python中模仿指针的另一种常见方法是使用dict。

假设您有一个应用程序,您希望每次发生有趣事件时都要跟踪它。实现此目的的一种方法是创建一个dict并使用其中一个项目作为计数器:

在祝辞祝辞,counters =, {“func_calls":, 0}   在祝辞祝辞,def 酒吧():   ,,,,,,计数器(“func_calls"), +=1   …   在祝辞祝辞,def  foo ():   ,,,,,,计数器(“func_calls"), +=1   ,,,,,,bar ()   …   在祝辞祝辞,foo ()   在祝辞祝辞,计数器(“func_calls")   2

在此示例中,计数器字典用于跟踪函数调用的数量。打电话后foo(),计数器已2按预期增加。所有因为dict类型是可变的。

请记住,这只是模拟指针行为,并不直接映射到C或c++中的真指针。也就是说,这些操作比在C或c++中更昂贵。

<强>使用Python对象

该dict选项是在Python中模拟指针的好方法,但有时记住您使用的密钥名称会很繁琐。如果您在应用程序的各个部分使用字典,则尤其如此。这是自定义Python类可以真正帮助的地方。

要构建最后一个示例,假设您要跟踪应用程序中的指标。创建一个类是抽象讨厌细节的好方法:

class , Metrics  (object ):   ,,,def , __init  __  (self ):   ,,,,,,,self  ._metrics ,=,, {,   ,,,,,,,,,,,,“func_calls”: 0,,   ,,,,,,,,,,,,“cat_pictures_served”: 0,,   ,,,,,,,}

此代码定义了一个度量类。该类仍然使用一个东西来保存实际数据,该数据位于_metrics成员变量中。这将为您提供所需的可变性。现在您只需要能够访问这些值。一个很好的方法是使用属性:

class 指标(对象):   号,,,,…   ,,@ property   ,,,def  func_calls(自我):   ,,,,,,,return  self._metrics (“func_calls")   ,,@ property   ,,,def  cat_pictures_served(自我):   ,,,,,,,return  self._metrics (“cat_pictures_served")

怎么在Python中模拟实现指针