0

私はこれについて少し混乱しています。私のスクリプトの1つに、次の方法があります。

ALIVES = []


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

ここで ALIVES は、メソッドの外で宣言された単なるリストです。ただし、メソッドが呼び出されるたびにupdate_alives、実際の長さに関係なく、常に次のように出力されALIVESます。

>>>1 alives found.

なぜそうしているのか誰か教えてもらえますか?

アップデート:

シェルで試してみましたが、動作します:

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

2つのことが間違っています:

  • 要求_get_dataしたURLが空の応答を返した場合、関数は空の文字列を返します。したがって、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 を追加すると、リスト内の要素が 1 つになります。

それを複数回行うと、リストに追加して増やします。

出力:

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