Python中的指针?

我知道Python没有指针,但有没有办法让这个产量2代替

 >>> a = 1 >>> b = a # modify this line somehow so that b "points to" a >>> a = 2 >>> b 1 


这里有一个例子:我想form.data['field']form.field.value始终具有相同的值。 这不是完全必要的,但我认为这将是很好的。

我希望form.data['field']form.field.value始终具有相同的值

这是可行的,因为它涉及装饰的名称和索引 – 即与您所询问的裸副本 ab 完全不同的构造,并且对于您的请求是完全不可能的。 为什么要求一件不可能完全不同于你实际需要的东西?

也许你不知道如何使用不同的名字和装饰名字。 当你引用一个名字a ,你会得到这个范围中最后绑定的对象(或者是一个例外,如果它没有被绑定在这个范围内) – 这是Python的一个深刻和基本的方面,它不可能被颠覆。 当你引用一个装饰xy ,你要求一个对象(对象x指的是)提供“ y属性” – 并且响应这个请求,对象可以执行完全任意的计算(并且索引是非常相似:它也允许执行任意的计算)。

现在,你的“实际需求”的例子是神秘的,因为在每种情况下涉及索引或属性获取的两个级别,所以你渴望的微妙可以在很多方面引入。 例如,除了value之外, form.field还有什么其他的属性呢? 没有进一步的价值计算,可能性将包括:

 class Form(object): ... def __getattr__(self, name): return self.data[name] 

 class Form(object): ... @property def data(self): return self.__dict__ 

.value的存在表明select第一种forms,加上一种无用的包装:

 class KouWrap(object): def __init__(self, value): self.value = value class Form(object): ... def __getattr__(self, name): return KouWrap(self.data[name]) 

如果赋值 form.field.value = 23也应该在form.data设置条目,那么包装必须变得更加复杂,而不是所有这些都是无用的:

 class MciWrap(object): def __init__(self, data, k): self._data = data self._k = k @property def value(self): return self._data[self._k] @value.setter def value(self, v) self._data[self._k] = v class Form(object): ... def __getattr__(self, name): return MciWrap(self.data, name) 

后面的例子大致和Python中的“指针”一样,但是理解这种微妙的东西只能用于索引和/或装饰的名字是很重要的从来没有与你最初问的名字!

你不可能只改变那一行。 你可以做:

 a = [1] b = a a[0] = 2 b[0] 

这将创build一个列表,将引用赋值给a,然后使用引用将第一个元素设置为2,然后使用b引用variables进行访问。

这不是一个错误,这是一个function :-)

在Python中查看“=”运算符时,不要考虑赋值。 你不分配东西,你绑定它们。 =是绑定运算符。

所以在你的代码中,你给的值是一个名字:a。 那么,你是在给a的价值一个名字:b。 然后,您将值2绑定到名称“a”。 绑定到b的值在这个操作中不会改变。

来自类似C的语言,这可能会让人困惑,但是一旦你习惯了它,你会发现它可以帮助你更清楚地阅读和推理你的代码:名称为“b”的值不会改变,除非你明确地改变它。 如果你做了一个“导入”,你会发现Python的Zen说Explicit比Implicit好。

还要注意,像Haskell这样的函数式语言也使用这种范式,在鲁棒性方面具有很高的价值。

从一个angular度来看, 一切都是Python中的一个指针。 你的例子很像C ++代码。

 int* a = new int(1); int* b = a; a = new int(2); cout << *b << endl; // prints 1 

(更接近等效的将使用某种types的shared_ptr<Object>而不是int* 。)

这里有一个例子:我想form.data ['field']和form.field.value始终具有相同的值。 这不是完全必要的,但我认为这将是很好的。

你可以通过在form.data的类中重载__getitem__form.data

是! 有一种方法可以使用variables作为Python中的指针!

我很遗憾地说,许多答案是部分错误的。 原则上每个同等(=)分配共享内存地址(检查id(obj)函数),但实际上并不是这样。 在上个学期中,有些variables的等号(“=”)行为作为内存空间的副本,主要是简单的对象(例如“int”对象),其他的不是(例如“list”,“dict”对象) 。

这是一个指针分配的例子

 dict1 = {'first':'hello', 'second':'world'} dict2 = dict1 # pointer assignation mechanism dict2['first'] = 'bye' dict1 >>> {'first':'bye', 'second':'world'} 

这是一个复制分配的例子

 a = 1 b = a # copy of memory mechanism. up to here id(a) == id(b) b = 2 # new address generation. therefore without pointer behaviour a >>> 1 

指针分配是一个非常有用的工具,不会浪费额外的内存,在某些情况下执行舒适的代码,

 class cls_X(): ... def method_1(): pd1 = self.obj_clsY.dict_vars_for_clsX['meth1'] # pointer dict 1: aliasing pd1['var4'] = self.method2(pd1['var1'], pd1['var2'], pd1['var3']) #enddef method_1 ... #endclass cls_X 

但是为了防止代码错误,必须注意这个用法。

总而言之,默认情况下,一些variables是裸号(像int,float,str这样的简单对象),有些是在它们之间分配的指针(例如dict1 = dict2)。 如何识别他们? 只要与他们一起尝试这个实验。 在具有variables浏览器面板的IDE中,通常看起来是指针机制对象定义中的内存地址(“@axbbbbbb …”)。

我build议调查的主题。 有很多人肯定对这个话题有更多的了解。 (请参阅“ctypes”模块)。 我希望这是有帮助的。 享受物体的好用处! 问候,何塞·克雷斯波