首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >pypubsub消息数据是通过引用还是值发送的,为什么不能修改消息数据?

pypubsub消息数据是通过引用还是值发送的,为什么不能修改消息数据?
EN

Stack Overflow用户
提问于 2020-04-17 06:19:05
回答 1查看 114关注 0票数 1

我正在使用python 3。我想知道附加到pypubsub Sendmessage命令的消息数据是通过引用还是通过值发送的?这似乎是通过参考发送的,但我想知道是否有人可以证实这一点。

文档还说“消息不可变性:消息内容必须由监听器保持不变,但PyPubSub不会验证这一点”。

下面的代码示例表明,正在发送对message-data参数的引用,修改这些数据会修改原始数据(而不是传递的数据副本)。为什么在侦听器例程中修改消息数据是个坏主意,有什么原因吗?

代码语言:javascript
复制
from pubsub import pub

class widget():    
    def __init__(self):
        self.thingy = [{'biz':0},{'baz':1},{'buz':2}]
        pub.subscribe(self.listen_for, 'wodget')

    def listen_for(self, arg1):
        print('wodget heard')
        print(self.thingy)
        print(arg1)

    def send_thingy(self):
        arg1 = self.thingy
        pub.sendMessage('widget',arg1=arg1)

class wodget():    
    def __init__(self):
        self.thongy = None
        pub.subscribe(self.listen_for, 'widget')

    # listen calendar               
    def listen_for(self, arg1):
        print('widget heard')
        print(arg1)
        self.thongy = arg1
        self.thongy[1]['baz']=99
        print(arg1)
        print(self.thongy)
        arg1 = self.thongy
        pub.sendMessage('wodget',arg1=arg1)

if __name__ == "__main__":

    aWidget = widget() 
    aWidget.send_thingy()

    aWodget = wodget()   
    aWidget.send_thingy()
EN

回答 1

Stack Overflow用户

发布于 2021-07-11 07:34:04

一个简单的脚本似乎建议使用pypubsub回调修改对象的行为与正常的python行为一致,这对我来说很有意义,因为pypubsub只是函数回调。见下文。

另请参阅:How do I pass a variable by reference?,了解有关不变性的讨论。

代码语言:javascript
复制
from pubsub import pub


class TestClass():
    def __init__(self):
        self.item_1 = 10.0
        self.item_2 = [1,2,3]
        self.item_3 = {1:[3,4,5], 2:[6,7,8]}

    def change_values(self):
        self.item_1 += 1
        self.item_2 = [v + 1 for v in self.item_2]
        self.item_3 = {k:[v + 1 for v in self.item_3[k]] for k in self.item_3}

    def print_values(self):
        print(self.item_1)
        print(self.item_2)
        print(self.item_3)
        # print('\n')


def receive_class(an_object):
    print('INSIDE - BEFORE')
    an_object.print_values()
    an_object.change_values()
    print('INSIDE - AFTER')
    an_object.print_values()


def receive_variable(a_variable):
    print('INSIDE - BEFORE')
    print(a_variable)
    a_variable += 1.0
    print('INSIDE - AFTER')
    print(a_variable)


def receive_list(a_list):
    print('INSIDE - BEFORE')
    print(a_list)
    a_list[0] += 1
    a_list[1] += 1
    a_list[2] += 1
    print('INSIDE - AFTER')
    print(a_list)


if __name__ == "__main__":
    pub.subscribe(receive_class, "test_topic_class")
    pub.subscribe(receive_variable, "test_topic_variable")
    pub.subscribe(receive_list, "test_topic_list")

    ### TEST 1
    print('-----CLASS TEST')
    myclass = TestClass()
    print('OUTSIDE - BEFORE')
    myclass.print_values()
    pub.sendMessage("test_topic_class", an_object=myclass)
    print('OUTSIDE - AFTER')
    myclass.print_values()

    ### TEST 2
    print('-----VARIABLE TEST')
    avar = 100.0
    print('OUTSIDE - BEFORE')
    print(avar)
    pub.sendMessage("test_topic_variable", a_variable=avar)
    print('OUTSIDE - AFTER')
    print(avar)

    ### TEST 3
    print('------LIST TEST')
    alist = [1.0, 2.0, 3.0]
    print('OUTSIDE - BEFORE')
    print(alist)
    pub.sendMessage("test_topic_list", a_list=alist)
    print('OUTSIDE - AFTER')
    print(alist)

输出:

代码语言:javascript
复制
-----CLASS TEST
OUTSIDE - BEFORE
10.0
[1, 2, 3]
{1: [3, 4, 5], 2: [6, 7, 8]}
INSIDE - BEFORE
10.0
[1, 2, 3]
{1: [3, 4, 5], 2: [6, 7, 8]}
INSIDE - AFTER
11.0
[2, 3, 4]
{1: [4, 5, 6], 2: [7, 8, 9]}
OUTSIDE - AFTER
11.0
[2, 3, 4]
{1: [4, 5, 6], 2: [7, 8, 9]}
-----VARIABLE TEST
OUTSIDE - BEFORE
100.0
INSIDE - BEFORE
100.0
INSIDE - AFTER
101.0
OUTSIDE - AFTER
100.0
------LIST TEST
OUTSIDE - BEFORE
[1.0, 2.0, 3.0]
INSIDE - BEFORE
[1.0, 2.0, 3.0]
INSIDE - AFTER
[2.0, 3.0, 4.0]
OUTSIDE - AFTER
[2.0, 3.0, 4.0]
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61260991

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档