1

これがコードです。私がする必要があるのは、実行を繰り返すと毎回 0 にリセットされるのではなく、iの値が 1 ずつ増加するように、グローバルにする方法を見つけることです。iのコードmainは、トレース機能を機能させるために「メイン」に埋め込んだ別のスクリプトからのものです。これはすべてJavaから行われています。

from __future__ import nested_scopes
import sys
import time

startTime = time.time()
timeLimit = 5000
def traceit(frame, event, arg):
if event == "line": 
    elapsedTime = ((time.time() - startTime)*1000)
    if elapsedTime > timeLimit:
         raise Exception, "The execution time has exceeded the time limit of " + str(timeLimit) + " milliseconds. Script will now terminate"
return traceit

sys.settrace(traceit)
def main______():
    try:
        i+=1
    except NameError:
        i=1
main______()
4

5 に答える 5

2

質問を大幅に編集したため、それに対する人々の回答が無意味に見えるのは残念です.

呼び出しごとに値が変更されない関数内でスコープが設定された変数を作成する方法は多数あります。それらはすべて、関数がファーストクラスのオブジェクトであるという事実を利用しています。つまり、関数は属性を持つことができます。例えば:

def f(x):
    if not hasattr(f, "i"):
       setattr(f, "i", 0)
    f.i += x
    return f.i

リストを引数のデフォルト値として使用し、関数を呼び出すときに引数に値を提供しないというハックもあります。

def f(x, my_list=[0]):
   my_list[0] = my_list[0] + x
   return my_list[0]

...しかし、なぜそれが機能するのかを理解していない限り、それを使用することはお勧めしません。

于 2009-10-17T18:44:03.577 に答える
2

変数をグローバルにするには、2 つのことを行う必要があります。

  1. 関数の外にあるグローバル スコープで変数を定義します。
  2. 関数内で global ステートメントを使用して、この関数がより大きなスコープ変数を使用する必要があることを Python が認識できるようにします。

例:

i = 0
def inc_i():
  global i
  i += 1
于 2012-06-12T16:39:10.963 に答える
0

i次のステートメントは、グローバル変数として宣言します。

global i
于 2009-10-17T06:39:57.200 に答える
0

「トレース機能を機能させるために「メイン」に埋め込む」というステートメントは非常にあいまいですが、次のことを望んでいるように聞こえます。

  • ユーザーから入力を受け取る
  • いくつかの永続的なコンテキストで実行します
  • 時間がかかりすぎる場合は実行を中止します

このような場合は、「exec」を使用します。例:

import sys
import time

def timeout(frame,event,arg):
    if event == 'line':
        elapsed = (time.time()-start) * 1000

code = """
try:
    i += 1
except NameError:
    i = 1
print 'current i:',i
"""
globals = {}

for ii in range(3):
    start = time.time()
    sys.settrace(timeout)
    exec code in globals
    print 'final i:',globals['i']
于 2009-10-23T21:11:18.777 に答える