我知道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
始终具有相同的值。这并不是完全必要的,但我认为这会很好。
例如,在PHP中,我可以这样做:
<?php
class Form {
public $data = [];
public $fields;
function __construct($fields) {
$this->fields = $fields;
foreach($this->fields as &$field) {
$this->data[$field['id']] = &$field['value'];
}
}
}
$f = new Form([
[
'id' => 'fname',
'value' => 'George'
],
[
'id' => 'lname',
'value' => 'Lucas'
]
]);
echo $f->data['fname'], $f->fields[0]['value']; # George George
$f->data['fname'] = 'Ralph';
echo $f->data['fname'], $f->fields[0]['value']; # Ralph Ralph
输出:
GeorgeGeorgeRalphRalph
或者像这样在C++中(我认为这是正确的,但是我的C++是生锈的):
#include <iostream>
using namespace std;
int main() {
int* a;
int* b = a;
*a = 1;
cout << *a << endl << *b << endl; # 1 1
return 0;
}
发布于 2010-06-24 09:31:15
您不可能只更改这一行。您可以执行以下操作:
a = [1]
b = a
a[0] = 2
b[0]
这会创建一个列表,将引用赋给a,然后b也会使用a引用将第一个元素设置为2,然后使用b引用变量进行访问。
发布于 2010-06-24 09:48:51
这不是一个bug,而是一个特性:-)
在查看Python中的'=‘运算符时,不要从赋值的角度考虑问题。你不分配东西,你绑定它们。=是一个绑定操作符。
因此,在您的代码中,您为值1提供了一个名称: a。然后,您为'a‘中的值提供了一个名称: b。然后,您将值2绑定到名称'a’。绑定到b的值在此操作中不会更改。
来自于类C语言,这可能会令人困惑,但一旦你习惯了它,你会发现它有助于你更清楚地阅读和推理你的代码:名称为'b‘的值不会改变,除非你显式地改变它。如果你做一个'import this',你会发现Python的Zen声明显式比隐式更好。
还要注意,函数式语言,如Haskell,也使用这种范例,在健壮性方面具有很大的价值。
发布于 2014-09-18 17:32:13
是!在python中,有一种方法可以将变量用作指针!
我很遗憾地说,许多答案是部分错误的。原则上,每个相等(=)赋值都共享内存地址(检查id(obj)函数),但实际上并非如此。有一些变量的相等(“=”)行为在上一项中作为内存空间的副本工作,主要是在简单对象(例如"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
指针赋值是一个非常有用的工具,用于别名而不浪费额外的内存,在执行comfy代码的某些情况下,
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
但是为了防止代码错误,人们必须意识到这种用法。
总而言之,在默认情况下,一些变量是barenames (简单对象,如int、float、str等),还有一些变量在它们之间赋值时是指针(例如dict1 = dict2)。如何识别它们?试着和他们一起做这个实验。在IDE的可变资源管理器面板中,通常显示的是内存地址(“@axbbbbb...”)在指针机制对象的定义中。
我建议在这个主题中进行调查。当然,有很多人对这个话题有更多的了解。(请参阅"ctypes“模块)。我希望它能对你有所帮助。享受物件的良好使用吧!你好,何塞·克雷斯波
https://stackoverflow.com/questions/3106689
复制相似问题