我有一个多播网络,需要不断向所有其他用户发送数据。这些数据会不断变化,所以我不希望程序员必须处理向用户发送数据包。因此,我试图找出如何在Python中引用任何对象或变量(我是Python的新手),因此可以由用户修改并更改多播数据包中发送的内容。
这是我想要的一个例子:
>>> test = "test"
>>> mdc = MulticastDataClient()
>>> mdc.add(test) # added into an internal list that is sent to all users
# here we can see that we are successfully receiving the data
>>> print mdc.receive()
{'192.168.1.10_0': 'test'}
# now we try to change the value of test
>>> test = "this should change"
>>> print mdc.receive()
{'192.168.1.10_0': 'test'} # want 'test' to change to -> 'this should change'
如何解决这个问题的任何帮助都将非常感激。
更新:
我也尝试过这种方式:
>>> test = [1, "test"]
>>> mdc = MulticastDataClient()
>>> mdc.add(test)
>>> mdc.receive()
{'192.168.1.10_1': 'test'}
>>> test[1] = "change!"
>>> mdc.receive()
{'192.168.1.10_1': 'change!'}
这确实奏效了。 然而,
>>> val = "ftw!"
>>> nextTest = [4, val]
>>> mdc.add(nextTest)
>>> mdc.receive()
{'192.168.1.10_1': 'change!', '192.168.1.10_4': 'ftw!'}
>>> val = "different."
>>> mdc.receive()
{'192.168.1.10_1': 'change!', '192.168.1.10_4': 'ftw!'}
这不起作用。我需要'ftw!'成为'不同'。在这种情况下。 我正在使用字符串进行测试,并习惯将字符串作为其他语言的对象。我只会编辑一个对象里面的内容,所以最终会起作用吗?
答案 0 :(得分:5)
在python中,一切都是引用,但字符串不可变。所以test
持有对“测试”的引用。如果您将“此更改”分配给test
,则只需将其更改为其他参考。但是您的客户仍然提到“测试”。或更短:它在python中不起作用! ; - )
解决方案可能是将数据放入对象中:
data = {'someKey':"test"}
mdc.add(data)
现在您的客户端持有对字典的引用。如果您像这样更新字典,您的客户将看到更改:
data['someKey'] = "this should change"
答案 1 :(得分:3)
你不能,不容易。 Python中的名称(变量)只是指针的位置。覆盖它,你只需用另一个指针替换指针,即只有使用相同变量的人才能看到更改。对象成员基本相同,但是每个人都可以看到它们的状态,并且可以传播这样的更改。您只需每次都使用obj.var
。当然,字符串(以及整数,元组,一些其他内置类型和其他几种类型)是不可变的,即你不能改变其他任何东西,因为你根本无法改变它。
然而,对象的可变性开启了另一种可能性:你可以,如果你不愿意通过它,编写一个包含abritary对象的包装类,允许通过{{1}更改该对象方法并委托对该对象重要的一切。你迟早会遇到令人讨厌的小问题。例如,我无法想象这对于通过所有成员的元编程或任何认为它必须混乱的东西都能很好地发挥作用。这也是令人难以置信的hacky(即不可靠)。有一个更容易的解决方案。
(另一方面,PyPy在其中一个非默认对象空间中有一个become
函数,它真实地将一个对象替换为另一个对象,每个人都可以看到该对象的引用。但是,我认为令人难以置信的潜在和误用混淆以及我们大多数人很少需要的事实使得它在实际代码中几乎是不可接受的。)