1

这是代码。我需要做的是找到一种使i全局化的方法,以便在重复执行时,值i将增加 1,而不是每次都重置为 0。中的代码main来自我嵌入“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

您需要做两件事来使您的变量成为全局变量。

  1. 在全局范围内定义变量,即在函数之外。
  2. 在函数中使用 global 语句,以便 Python 知道该函数应该使用更大范围的变量。

例子:

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

未在函数或方法中定义但在 Python 中的模块级别上定义的变量与 Python 中的全局变量一样接近。您可以通过另一个脚本访问它

from scriptA import variablename

这将执行脚本,并让您访问该变量。

于 2009-10-16T20:10:44.240 回答
0

以下语句声明i为全局变量:

global i
于 2009-10-17T06:39:57.200 回答
0

您的声明“嵌入'main'以使跟踪功能正常工作”非常模棱两可,但听起来您想要的是:

  • 从用户那里获取输入
  • 在一些持久的上下文中执行它
  • 如果执行时间过长,则中止执行

对于这类事情,请使用“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 回答