如何在 Python 中模拟通过引用对象传递变量?[复制]

How can I emulate passing a variable by reference to an object in Python? [duplicate]

提问人:jarlemag 提问时间:11/21/2020 更新时间:11/21/2020 访问量:185

问:

我想创建一个 Python 类,它可以:

  • 实例化时将变量作为参数
  • 将变量的值存储在属性中
  • 每当使用“update()”方法时,存储变量的当前值。

下面的代码没有按预期工作。如何通过方法调用更新属性的值,请记住它必须适用于任意变量?

class MyObject():
    def __init__(self,data): 
        self.data = data 

    def update(self):
        self.data = data

value = 0

dataobject = MyObject(value)

value = 1

dataobject.update() #NameError: name 'data' is not defined
Python 按引用传递

评论

1赞 wim 11/21/2020
这不是 Python 的工作方式......将该值传递到 Update 函数中。
2赞 joshmeranda 11/21/2020
这回答了你的问题吗?如何通过引用传递变量?
0赞 rioV8 11/21/2020
然后,您需要创建一个仅具有值作为成员的类,整数是不可变的,并且没有句柄/ID
1赞 juanpa.arrivillaga 11/21/2020
你不能真正模拟引用传递,如你所愿。在 Python 中,对对象的引用被传入,因此您可以改变该对象,并且效果在调用方中可见。
0赞 wjandrea 11/21/2020
@rioV8 Int 确实有一个 ID。也许你的意思是一个不同的术语?例如,-> 140736127440512在我的解释器上。id(0)

答:

1赞 TSeymour 11/21/2020 #1

在 Python 中,int 和其他基本类型无法按照您想要的方式传递引用(列表和其他类型的对象有不同的故事,但我只会回答您提出的问题)。

我真的不推荐这种方法,但你可以使用 Global 关键字来做到这一点:

class MyObject():
    def __init__(self,data):
        self.data = data

    def update(self):
        global value         # only change is this
        self.data = value

value = 0

dataobject = MyObject(value)

value = 1

dataobject.update()

print(dataobject.data)  # prints 1

Python 中的对象没有私有属性,因此您可以直接设置值:

dataobject.data = 1

这些都不是我认为最佳实践,但我必须更多地了解您正在尝试做什么,以便为您提供最佳建议。请注意,如果您计划拥有一堆 MyObject 实例,则尝试将它们与单个全局值同步可能会失控。我会建议一个新问题,其中包含有关您正在尝试做什么的更多信息,并且有人会给出最佳方法。

评论

1赞 jarlemag 11/21/2020
我已经考虑过“全局”,但这不会让我使用任意变量作为参数。出于同样的原因,我无法直接设置该值。该类的用途是表示一个 UI 元素来显示任意数据,这些数据需要保持最新。(确切地说,是 pygame 中 Sprite 类的子类。update() 方法为所有 Sprite 对象调用每帧)。
0赞 jarlemag 11/21/2020
这个问题已经关闭了,所以我不能把它添加为答案,但我现在(我认为)通过使用列表作为参数解决了它:class MyObject(): def __init__(self,data): self.myref = data self.data = self.myref[0] def update(self): self.data = self.myref[0]
0赞 rioV8 11/21/2020
如果出现以下情况,这将不起作用val2 = 5; do2 = MyObject(val2); val2 = 10; do2.update()
0赞 jarlemag 11/21/2020
@riov8:这里的代码似乎工作正常:pastebin.com/5iBJzNJV 你觉得它有什么问题吗?(或者也许我误会了你。不确定您是否在答案或我的问题中引用了代码)。
1赞 rioV8 11/21/2020
@jarlemag我参考了 TSeymour 的解决方案,如果你实现一个实现了运算符的类,那就更好了,python-reference.readthedocs.io/en/latest/docs/dunderdsc/......__set__