0

我对这个有点困惑。在我的一个脚本中,我有以下方法。

ALIVES = []


def insert_in_alives(num):
    ALIVES.append(num)
    print len(ALIVES), "alives found."

这里 ALIVES 只是在方法之外声明的一个列表。但是每当update_alives调用该方法时,它总是打印以下内容,无论实际长度ALIVES是多少。

>>>1 alives found.

有人能告诉我为什么会这样吗?

更新:

在 shell 中尝试过,它可以工作:

In [2]: a = [1,2,3]

In [3]: print len(a)
3
In [4]: def test(num):
   ...:     a.append(num)
   ...:     print len(a)
   ...:     

In [5]: test(5)
4

In [6]: test(7)
5
4

2 回答 2

3

有两点不对:

  • 如果您请求的 URL 返回一个空响应,您的_get_data函数将返回一个空字符串。因此,您的proxy_alive()函数也不会调用insert_in_alives()

    改为proxy_alive()测试None

    def proxy_alive(proxy):
        test = _get_data('http://m.naukri.com', proxy=proxy, silent=True)
        if test is not None:
            insert_in_alives(proxy)
    
  • 您正在检查线程中的代理,并且每个线程同时insert_in_alives() 调用。这导致了一种竞争条件,插入物正在相互替换。

    您需要在那里添加一个线程锁。

于 2013-03-05T12:14:25.103 回答
0

代码很好。

ALIVES = []


def update_alives(num):
    ALIVES.append(num)
    print ALIVES
    print len(ALIVES), "alives found."


update_alives(3)
update_alives(5)
update_alives(6)

如果我这样做,我会在列表中添加一个 3,这会导致其中有一个元素。

如果我不止一次这样做,你会追加到列表中,增加它。

输出:

[3]
1 alives found.
[3, 5]
2 alives found.
[3, 5, 6]
3 alives found.
于 2013-03-05T12:06:30.450 回答