Python和线程:为什么;“大的”;从其他方法访问时列表实体是否丢失?

Python和线程:为什么;“大的”;从其他方法访问时列表实体是否丢失?,python,multithreading,Python,Multithreading,一个大型实体(列表)通过一个方法(foo)创建并绑定到self.result)。 在第二种方法(传输)中尝试访问此实体时,从特定大小开始(列表中的字符数介于150000到155000之间)失败。打印(print self.result)从内部transmit使我一无所有。 我想这很重要:self.foo在单独的线程中直接调用。 请帮忙。如何在没有这样的限制的情况下,将这样一个“大”实体从一个单独的线程返回到主线程 ... def apply(self): self.ge

一个大型实体(列表)通过一个方法(
foo
)创建并绑定到
self.result
)。 在第二种方法(
传输
)中尝试访问此实体时,从特定大小开始(列表中的字符数介于150000到155000之间)失败。打印(
print self.result)
从内部
transmit
使我一无所有。 我想这很重要:
self.foo
在单独的线程中直接调用。
请帮忙。如何在没有这样的限制的情况下,将这样一个“大”实体从一个单独的线程返回到主线程

...

    def apply(self):
        self.get_data()
        self.start_foo_thread()

    def start_foo_thread(self):
        self.foo_thread = threading.Thread(target=self.foo)
        self.foo_thread.daemon = True
        self.progressbar.start()
        self.foo_thread.start()
        self.master.after(20, self.check_foo_thread)

    def check_foo_thread(self):
        if self.foo_thread.is_alive():
            self.master.after(20, self.check_foo_thread)
        else:
            self.progressbar.stop()

    def foo(self): 
        s = self.stringinput
        n = self.numberinput
        list = multiply_str_into_list(s, n)
        self.result = list_to_text(list)
        print self.result # output is not None 

    def transmit(self):
        print self.result # output is None for more than about 155,000 characters in the list
        return self.result

def multiply_str_into_list(string, n): #takes a string and multiplies it by n and writes into list
    n_string = []
    for i in range(0,n):
        n_string.append(string)
    return n_string

def list_to_text(list): #takes a list as input and joins it into str with each list item on a new line
    a = '\n'.join(list)
    return a

您没有提供足够的信息来重现问题,更不用说调试它了,但我猜在某个时候,您正在做这样的事情:

self.result = self.result.append(x)
由于
.append()。它也不必是
.append()
——所有变异列表的方法都返回
None


至于为什么它只发生在某个特定的大小上,也许你有一些类似上面的代码只在某个特定的大小上触发,或者这是一个误会。

@kindall:yes我在某个时候使用了.append()(我已经编辑了我的问题)。发生这种情况时,我仍然无法获得一定大小的连接……Python名称是指向对象的指针——名称被更改为指向
None
,而不是列表。当列表变得太大时,Python不会神奇地将指向
list
s的指针更改为指向
None
。代码中的某些内容正在这样做。我提出了一种可能发生的方式,但可能还有其他方式。找到它并修复它。@kindall:我现在已经给出了更多的代码,也许你可以发现我弄糟了什么?@solarisman:你的其余代码如何确定
self.foo_线程已经完成,所以现在可以调用
transmit()
<代码>self.result
在此之前不应被任何其他线程访问。@solarisman:
self.request
如果它所属的对象(我怀疑是某种类型的TKinter对话框)在创建后已超出范围,并且调用了
apply()
,则可能会被更改为
无。不知道为什么只有当列表中的数字超过一定的大小时才会发生这种情况。虽然据我所知,这不是你问题的原因,一般来说,你不应该给东西命名
list
string
,因为这些东西已经用于内置类型或模块,这样做可能会导致意外的副作用,也会让其他人难以阅读。这也会使调试变得更加困难。@martineau:+1以获取提示