Python |脚本执行后如何使局部变量全局化

时间:2009-10-16 19:35:49

标签: python variables interpreter global local

这是代码。我需要做的是找到一种方法使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______()

5 个答案:

答案 0 :(得分:2)

不幸的是,你已经如此严重地编辑了这个问题,以至于人们对它的回答似乎毫无意义。

有许多方法可以在函数中创建范围内的变量,其值在调用之间保持不变。所有这些都利用了函数是第一类对象的事实,这意味着它们可以具有属性。例如:

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

还有一个hack使用列表作为参数的默认值,然后在调用函数时从不为参数提供值:

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

...但我不建议使用它,除非你理解为什么它有效,甚至可能不是。

答案 1 :(得分:2)

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

  1. 在全局范围内定义变量,即在...之外 功能
  2. 在函数中使用全局语句,以便Python 知道这个函数应该使用更大的范围变量。
  3. 示例:

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

答案 2 :(得分:0)

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

从其他脚本访问该文件
from scriptA import variablename

这将执行脚本,并允许您访问变量。

答案 3 :(得分:0)

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

global i

答案 4 :(得分: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']