我正在尝试将内部语言(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捆绑在一起。
发布于 2009-07-17 21:49:07
这可以显式地完成。
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
发布于 2009-07-17 21:20:22
您可能想要阅读。底线是:所有的变量都是引用。
更重要的是,不要考虑变量,而是可以命名的对象。
发布于 2009-07-17 22:01:57
如果你正在编译一种类似C的语言,比如:
func()
{
var a = 1;
var *b = &a;
*b = 2;
assert(a == 2);
}
到Python中,那么所有“Python中的一切都是引用”之类的东西都是用词不当的。
诚然,Python中的一切都是引用,但许多核心类型( in、字符串)是不可变的,这一事实在许多情况下有效地取消了这一点。在Python中没有直接实现上述功能的方法。
现在,您可以间接地执行此操作:对于任何不可变类型,将其包装在可变类型中。Ephemient的解决方案有效,但我经常这样做:
a = [1]
b = a
b[0] = 2
assert a[0] == 2
(我这样做是为了解决Python在2.x中缺少“非本地”的问题。)
这意味着更多的开销:每个不可变类型(或者每个类型,如果您不尝试区分)突然创建一个列表(或另一个容器对象),因此您会显著增加变量的开销。单独来说,这不是很多,但当应用到整个代码库时,它会增加的。
您可以通过仅包装不可变类型来减少这种情况,但是您需要跟踪输出中哪些变量被包装,哪些没有包装,这样您就可以适当地使用"a“或"a”访问值。它可能会变得多毛。
至于这是不是一个好主意--这取决于你为什么要这么做。如果你只是想要一些东西来运行虚拟机,我倾向于说不。如果您希望能够从Python调用您现有的语言,我建议使用您现有的VM并为其创建Python绑定,这样您就可以从Python访问和调用它。
https://stackoverflow.com/questions/1145722
复制相似问题