2011-05-31 814 views
6

我有一个多播网络,需要连续发送数据给所有其他用户。这些数据会不断变化,所以我不希望程序员必须处理向用户发送数据包。因此,我试图找出如何在Python中引用任何对象或变量(我是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' 

我如何能解决这个问题的任何帮助将是非常赞赏。

UPDATE:

我也这样尝试过,以及:

>>> 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

你是什么意思“我只会编辑对象内的内容“? – 2011-05-31 20:52:45

+0

@rshallit所以如果我们有一个名为“pos”的位置对象,我只能操作pos.x和pos.y,您不必担心“pos”在内存中改变其位置。我想这对我来说是多余的。 – 2011-05-31 23:45:25

回答

5

在python中,一切都是引用,但字符串不可变。所以test持有对“测试”的引用。如果您将“这应该更改”分配给test,您只需将其更改为另一个参考。但您的客户仍然有“测试”的参考。或者更短:它在python中不能这么做! ;-)

一个解决办法可能是把数据放到一个对象:

data = {'someKey':"test"} 
mdc.add(data) 

现在你的客户持有的参考字典。如果您更新字典这样,您的客户将看到变化:

data['someKey'] = "this should change" 
+0

你确定这会做所有他想要的吗?我不熟悉MulticastDataClient(如果它是一个实际的类/库),但至少我假设你必须做一些事情来迫使它在改变之后重新发送数据包 – Foon 2011-05-31 19:36:38

+0

你假定数据跨过进程边界。在这种情况下,你是对的,但对我来说,这个问题意味着原始的海报意识到这一点。我认为这很明显,python引用不能通过套接字工作。 – Achim 2011-05-31 19:38:52

+0

@Fun MulticastDataClient是我创建的东西。它旨在控制发送本地用户“拥有”并多播它的数据。需要使用继承的MulticastDataClient对象发送各种数据。所以一个对象可以处理GPS位置,另一个可以处理用户信息等。现在,我只是使用字符串来测试。 在提出这个问题之前,我使用了@Achim的一个实现,并且编辑了我的问题以显示我遇到的问题。谢谢@Achim让我回到这个方向。 – 2011-05-31 20:08:17

3

你不能,不容易。 Python中的名称(变量)只是指针的位置。覆盖它,你只需用另一个指针替换指针,即只有使用相同变量的人才能看到更改。对象成员基本上是相同的,但是由于每个人都可以看到他们的状态,并且有指向他们的指针,所以可以像这样传播更改。你只需要使用obj.var每一次。当然,字符串(连同整数,元组,其他几种内置类型和其他几种类型)是不可变的,即你不能改变任何关于其他类型的东西,因为你根本无法改变它。

然而,对象的可变性打开另一个可能性:你可能,如果你不屑把它拉过,写一个包含abritary对象的包装类,允许改变该对象虽然set()方法和代表一切重要那个对象。尽管如此,你早晚会遇到棘手的小问题。例如,我无法想象这种方式会适用于所有成员的元编程,或任何认为它必须混淆的元编程。它也非常不可靠(即不可靠)。有一个更简单的解决方案。(在附注中,PyPy在其中一个非默认对象空间中有一个become函数,它真正地真正地将一个对象替换为另一个对象,每个人都可以通过引用该对象来看到它。任何其他的实现,但我认为难以置信的潜力和误用的困惑以及我们大多数人很少需要这样的事实使得它在真实代码中几乎不可接受。)