Python 中的指针?

新手上路,请多包涵

我知道 Python 没有指针,但是有没有办法让这个 yield 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;
}

原文由 mpen 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 291
2 个回答

你不可能只改变那条线。你可以做:

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

这创建了一个列表,将引用分配给 a,然后 b 也使用 a 引用将第一个元素设置为 2,然后使用 b 引用变量进行访问。

原文由 Matthew Flaschen 发布,翻译遵循 CC BY-SA 2.5 许可协议

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

这是可行的,因为它涉及修饰名称和索引——即,与您询问的 裸名 ab 完全 不同的构造,并且完全符合您的要求不可能的。为什么要要求一些不可能的东西 并且与 你真正 想要 的(可能的)东西完全不同?!

也许您没有意识到裸名和装饰名有多么不同。当您引用裸名 a 时,您得到的正是对象 a 最后绑定到此范围内(如果未绑定在此范围内则为异常)- - 这是 Python 如此深刻和基本的方面,它不可能被颠覆。当您引用 修饰 名称 x.y 时,您是在询问一个对象(对象 x 指的)请提供“ y -dd-057f 属性”–并响应该请求,该对象可以执行完全任意的计算(并且索引非常相似:它也允许执行任意计算作为响应)。

现在,您的“实际需求”示例很神秘,因为在每种情况下都涉及两个级别的索引或属性获取,因此可以通过多种方式引入您渴望的微妙之处。 form.field 除了 value 之外还有哪些其他属性?如果没有进一步的 .value 计算,可能性将包括:

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

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

.value 的存在建议选择第一种形式,加上一种无用的包装:

 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 中与您似乎想要的“指针”的含义大致接近——但了解这种微妙之处只能与 索引 和/或 装饰名称 一起使用, 永远不会 像你最初问的那样使用裸名!

原文由 Alex Martelli 发布,翻译遵循 CC BY-SA 2.5 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏