2009-10-16 77 views
1

以下是代碼。我需要做的是找到一種方法使全局變爲i,以便在重複執行時,i的值將遞增1,而不是每次都重置爲0。 main中的代碼來自另一個腳本,爲了使跟蹤功能正常工作,我嵌入了'main'中。這一切都是從Java完成的。Python |如何在腳本執行後使局部變量全局變爲

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______() 
+2

你爲什麼不試圖把SCRIPTA和scriptB到合適的班級?如果你的腳本使用對象方法,這將是微不足道的。你爲什麼不使用類和對象? –

+2

+1這聽起來像一團糟 –

+0

我有一個pyhton編輯器,用戶可以輸入腳本。我必須通過setTrace函數檢查腳本執行的時間。我通過將腳本放在scriptB中的主要方法中來完成此操作,否則它將無法工作。 大部分工作。唯一的問題是,當腳本被多次執行時,它不具有scriptA的全局變量的功能。即當這種 嘗試: \t I + = 1 除了NameError: \t I = 0 運行多次,什麼用來發生(當腳本沒有被修改)是,我將在每次執行時被增加。 – frank

回答

0

變量未在函數或方法中定義,但在Python中的模塊級別與您在Python中使用全局變量時相近。您可以通過另一個腳本訪問

from scriptA import variablename 

這將執行腳本,並讓您訪問該變量。

+0

如果varibalename在一個函數內怎麼辦?我們還可以訪問它嗎? – user2475677

+0

@ user2475677不,你不能。 –

0

下面的語句聲明i爲全局變量:

global i 
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] 

..但我不會推薦使用它,除非你明白它爲什麼有效,甚至可能不會。

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'] 
2

你需要做兩件事情,使您的變量全球。

  1. 在全局範圍內定義變量,即在 函數之外。
  2. 在函數中使用全局語句,以便Python 知道此函數應該使用較大的作用域變量。

例子:

i = 0 
def inc_i(): 
    global i 
    i += 1 
+0

...或者你是否試圖使其持久化,即跟蹤腳本執行之間的值? 可能想使用泡菜。 – ChipJust