由GC收集的Python列表

由GC收集的Python列表,python,oop,reference,garbage-collection,rpyc,Python,Oop,Reference,Garbage Collection,Rpyc,我一直在阅读Python中的弱引用和强引用,特别是关于看起来像 ReferenceError: weakly-referenced object no longer exists 这里我有一个基本的RPC接口,它将对象从客户端传递到服务器,然后服务器将这些对象保存到预定义的类中。下面是我代码中所有结构的基本概要。注意“标志”的行为: 客户端: # target = 'file.txt', flags = [(tuple, tuple), (tuple, tuple)] def file_rem

我一直在阅读Python中的弱引用和强引用,特别是关于看起来像

ReferenceError: weakly-referenced object no longer exists
这里我有一个基本的RPC接口,它将对象从客户端传递到服务器,然后服务器将这些对象保存到预定义的类中。下面是我代码中所有结构的基本概要。注意“标志”的行为:

客户端:

# target = 'file.txt', flags = [(tuple, tuple), (tuple, tuple)]
def file_reminder(self, flags, target):         
    target = os.path.abspath(target)          
    c = rpyc.connect("localhost", port)        
    # flags can be referenced here
    return c.root.file_reminder(flags, target)  
服务器端:

class MyService(rpyc.Service):
     jobs = EventLoop().start()

      # this is what's called from the client side
      def exposed_file_reminder(self, flags, target):
           reminder = FileReminder(flags, target)
           self.jobs.add_reminder(reminder)
           # reminder.flags can be referenced here
           return "Added a new reminder"

class FileReminder(object):
     def __init__(self, flags, target):
         self.flags = flags
         self.target = target

     def __str__(self):
         return str(self.flags) + target

class EventLoop(threading.Thread):
     def __init__(self):
         self.reminders = []

     def add_reminder(self, reminder):
         # reminder.flags can be referenced here
         self.reminders.append(reminder)

     def run(self):
         while True:
             for reminder in self.reminders:
                  # reminder.flags is no longer defined here
                  print reminder
这里的问题是“flags”参数在线程中打印(或在线程的run()函数中以任何方式操作)时总是抛出ReferenceError。注意,目标处理得很好。当我将“flags”更改为不可变(如字符串)时,不会出现ReferenceError。这让我头痛,所以任何帮助都将不胜感激

使用,我能够解决这个问题,尽管我不知道是否使用了“最佳实践”

我认为错误在于:虽然有许多对列表本身的引用,但列表中没有对元组的显式引用。我所做的是在
文件提醒的实例化上创建列表的深度副本

比如说

def __init__(self, flags, target):
    self.flags = []
    for flag in flags:
        flags.append(flag)
这似乎有效