首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Python中的指针?

Python中的指针?
EN

Stack Overflow用户
提问于 2010-06-24 09:28:56
回答 8查看 330.3K关注 0票数 139

我知道Python没有指针,但是有没有办法让它生成2

代码语言:javascript
复制
>>> 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中,我可以这样做:

代码语言:javascript
复制
<?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

输出:

代码语言:javascript
复制
GeorgeGeorgeRalphRalph

ideone

或者像这样在C++中(我认为这是正确的,但是我的C++是生锈的):

代码语言:javascript
复制
#include <iostream>
using namespace std;

int main() {
    int* a;
    int* b = a;
    *a = 1;
    cout << *a << endl << *b << endl; # 1 1

    return 0;
}
EN

回答 8

Stack Overflow用户

发布于 2010-06-24 09:31:15

您不可能只更改这一行。您可以执行以下操作:

代码语言:javascript
复制
a = [1]
b = a
a[0] = 2
b[0]

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

票数 62
EN

Stack Overflow用户

发布于 2010-06-24 09:48:51

这不是一个bug,而是一个特性:-)

在查看Python中的'=‘运算符时,不要从赋值的角度考虑问题。你不分配东西,你绑定它们。=是一个绑定操作符。

因此,在您的代码中,您为值1提供了一个名称: a。然后,您为'a‘中的值提供了一个名称: b。然后,您将值2绑定到名称'a’。绑定到b的值在此操作中不会更改。

来自于类C语言,这可能会令人困惑,但一旦你习惯了它,你会发现它有助于你更清楚地阅读和推理你的代码:名称为'b‘的值不会改变,除非你显式地改变它。如果你做一个'import this',你会发现Python的Zen声明显式比隐式更好。

还要注意,函数式语言,如Haskell,也使用这种范例,在健壮性方面具有很大的价值。

票数 38
EN

Stack Overflow用户

发布于 2014-09-18 17:32:13

是!在python中,有一种方法可以将变量用作指针!

我很遗憾地说,许多答案是部分错误的。原则上,每个相等(=)赋值都共享内存地址(检查id(obj)函数),但实际上并非如此。有一些变量的相等(“=”)行为在上一项中作为内存空间的副本工作,主要是在简单对象(例如"int“对象)中,而其他变量则不是(例如"list”、"dict“对象)。

下面是一个指针赋值的示例

代码语言:javascript
复制
dict1 = {'first':'hello', 'second':'world'}
dict2 = dict1 # pointer assignation mechanism
dict2['first'] = 'bye'
dict1
>>> {'first':'bye', 'second':'world'}

以下是拷贝分配的示例

代码语言:javascript
复制
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代码的某些情况下,

代码语言:javascript
复制
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“模块)。我希望它能对你有所帮助。享受物件的良好使用吧!你好,何塞·克雷斯波

票数 29
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3106689

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档