Python中的引用

2024-05-14 15:30:38 发布

您现在位置: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'

如果能帮我解决这个问题,我将不胜感激。在

更新:

我也试过这样做:

^{pr2}$

这确实奏效了。 但是

>>> 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!”在这种情况下。 我使用字符串进行测试,并且习惯于字符串作为其他语言的对象。我将只编辑对象内部的内容,所以这会结束工作吗?在


Tags: theto对象用户testadd内容that
2条回答

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

然而,对象的易变性打开了另一种可能性:如果您费心去实现它,您可以编写一个包含一个抽象对象的包装类,允许通过set()方法更改该对象,并将所有重要的内容委托给该对象。但你迟早会遇到麻烦的。例如,我无法想象这样做能很好地处理所有成员的元编程,或者任何认为它必须处理的事情。它也非常粗糙(即不可靠)。显然有一个更简单的解决办法。在

(附带说明一下,PyPy在它的一个非默认对象空间中有一个^{}函数,它真正地用另一个对象替换了一个对象,每个人都可以看到这个对象的引用。但它不能与任何其他实现一起工作,我认为难以置信的潜在性和误用混淆,以及我们大多数人很少需要这一事实,这使得它在实际代码中几乎无法接受。)

在python中,所有东西都是引用,但字符串不是可变的。所以test是对“test”的引用。如果将“thishouldschange”赋给test,则只需将其更改为另一个引用。但你的客户还是提到了“测试”。或者更短:它在python中不是这样工作的!;—)

解决方案可能是将数据放入对象中:

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

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

^{pr2}$

相关问题 更多 >

    热门问题