用Python模拟指针

2024-05-06 21:14:14 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试将内部语言(ihl)交叉编译为Python。

一个IHL的特性是指针和引用,这些行为和C或C++所期望的一样。

例如,您可以执行以下操作:

a = [1,2];  // a has an array 
b = &a;     // b points to a
*b = 2;     // derefernce b to store 2 in a
print(a);   // outputs 2
print(*b);   // outputs 2

有没有办法在Python中复制这个功能。

我应该指出,我想我把一些人搞糊涂了。我不想要Python中的指针。我只是想从Python专家那里了解一下,我应该生成什么样的Python来模拟上面所示的情况

我的Python不是最伟大的,但到目前为止,我的探索还没有取得任何有希望的成果

我应该指出的是,我们正在寻求从ihl转向更通用的语言,因此如果有人能提出更合适的另一种语言,我们就不会真正依赖于Python。


Tags: tostorean语言特性outputsarray交叉
3条回答

您可能需要阅读Semantics of Python variable names from a C++ perspective。底线是:所有变量都是引用。

更重要的是,不要考虑变量,而要考虑可以命名为的对象。

如果你正在编译一种类似于C语言的语言,请说:

func()
{
    var a = 1;
    var *b = &a;
    *b = 2;
    assert(a == 2);
}

在Python中,所有的“Python中的所有内容都是引用”都是一个错误的名称。

Python中的所有内容都是一个引用,但许多核心类型(int、string)是不可变的,这一事实在许多情况下有效地撤销了这一点。在Python中没有直接实现上述内容的方法。

现在,您可以间接地这样做:对于任何不可变类型,将其包装为可变类型。埃弗米恩特的解决方案有效,但我经常这样做:

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

(我这样做是为了解决Python在2.x中缺少“非本地”的问题几次。)

这意味着更多的开销:每一个不可变类型(或者每一个类型,如果你不试图区分的话)突然创建一个列表(或者另一个容器对象),所以你显著增加了变量的开销。单独来说,它不是很多,但是当应用到整个代码库时,它会累加起来。

您可以通过只包装不可变类型来减少这种情况,但是您需要跟踪输出中包装的变量和不包装的变量,以便您可以适当地使用“a”或“a[0]访问该值。可能会有毛。

至于这是不是个好主意,那要看你为什么这么做。如果你只是想运行一个VM,我倾向于说不。如果你想从Python调用你现有的语言,我建议你使用你现有的VM并为它创建Python绑定,这样你就可以从Python访问和调用它。

这可以显式地完成。

class ref:
    def __init__(self, obj): self.obj = obj
    def get(self):    return self.obj
    def set(self, obj):      self.obj = obj

a = ref([1, 2])
b = a
print(a.get())  # => [1, 2]
print(b.get())  # => [1, 2]

b.set(2)
print(a.get())  # => 2
print(b.get())  # => 2

相关问题 更多 >