python - 在 Python 中存储对引用的引用?

标签 python reference

使用 Python,是否有任何方法可以存储对引用的引用,以便我可以更改该引用在另一个上下文中所指的内容?例如,假设我有以下类(class):

class Foo:
   def __init__(self):
      self.standalone = 3
      self.lst = [4, 5, 6]

我想创建类似于以下内容的内容:

class Reassigner:
   def __init__(self, target):
      self.target = target
   def reassign(self, value):
      # not sure what to do here, but reassigns the reference given by target to value

使得下面的代码

f = Foo()
rStandalone = Reassigner(f.standalone) # presumably this syntax might change
rIndex = Reassigner(f.lst[1])
rStandalone.reassign(7)
rIndex.reassign(9)

将导致 f.standalone 等于 7f.lst 等于 [4, 9, 6].

本质上,这类似于指针到指针。

最佳答案

简而言之,这是不可能的。完全没有。最接近的等效项是存储对要重新分配其成员/项目的对象的引用,加上属性名称/索引/键,然后使用 setattr/setitem。但是,这会产生完全不同的语法,您必须区分两者:

class AttributeReassigner:
    def __init__(self, obj, attr):
        # use your imagination
    def reassign(self, val):
        setattr(self.obj, self.attr, val)

class ItemReassigner:
    def __init__(self, obj, key):
        # use your imagination
    def reassign(self, val):
        self.obj[self.key] = val

f = Foo()
rStandalone = AttributeReassigner(f, 'standalone')
rIndex = ItemReassigner(f.lst, 1)
rStandalone.reassign(7)
rIndex.reassign(9)

我实际上使用过一些非常相似的东西,但有效的用例很少而且相差甚远。 对于全局/模块成员,您可以使用模块对象或 globals(),具体取决于您是在模块内部还是外部。根本没有局部变量的等价物 -- locals() 的结果不能用于可靠地更改局部变量,它只对检查.

我实际上用过一些非常相似的东西,但有效的用例很少。

关于python - 在 Python 中存储对引用的引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16470196/

相关文章:

python - 添加和删​​除具有一对多关系的行的问题

c++ - 关于传递参数在 C++ 中如何工作的问题

visual-studio - “Are you missing an assembly reference?”编译错误-Visual Studio

Java PhantomReference 未被排队

python - 使用列表中的任何值进行逻辑检查?

python - 优化Python中的广度优先搜索

python - 如何加速 pandas 数据帧迭代

c++ - 如何高效、正确地在 vector 中插入对象

c++ - 将变量赋值给函数内部的引用。

Python 子进程交互,为什么我的进程使用 Popen.communicate 而不是 Popen.stdout.read()?