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

Python |如何在脚本执行后使局部变量全局化,python,variables,interpreter,global,local,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 ==

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

在函数或方法中未定义但在Python中位于模块级别的变量与Python中的全局变量非常接近。您可以通过以下方式从另一个脚本访问该脚本:

from scriptA import variablename

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

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

from scriptA import variablename

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

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

global i

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

global i

不幸的是,你对这个问题进行了大量的编辑,以至于人们对它的回答显得毫无意义

有许多方法可以在函数中创建一个变量作用域,该变量的值在不同的调用中保持不变。它们都利用了函数是一级对象这一事实,这意味着它们可以具有属性。例如:

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]

…但我不建议你使用它,除非你明白它为什么有效,甚至在那时也不可能。

不幸的是,你对这个问题进行了大量的编辑,以至于人们对它的回答显得毫无意义

有许多方法可以在函数中创建一个变量作用域,该变量的值在不同的调用中保持不变。它们都利用了函数是一级对象这一事实,这意味着它们可以具有属性。例如:

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]
…但我不建议您使用它,除非您理解它的工作原理,甚至可能不是这样。

您的语句“嵌入'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']
您的语句“嵌入'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']

要使变量成为全局变量,需要做两件事

  • 在全局范围内定义变量,即 功能
  • 在函数中使用global语句,以便Python 知道此函数应该使用范围更大的变量
  • 例如:

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

    要使变量成为全局变量,需要做两件事

  • 在全局范围内定义变量,即 功能
  • 在函数中使用global语句,以便Python 知道此函数应该使用范围更大的变量
  • 例如:

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

    为什么不尝试将scriptA和scriptB转换为适当的类?如果您的脚本中包含对象方法,这将是微不足道的。为什么不使用类和对象呢?我有一个pyhton编辑器,用户可以在其中输入脚本。我必须通过setTrace函数检查脚本执行了多长时间。我通过将脚本放在scriptB的主方法中来实现这一点,否则它将无法工作。这在很大程度上是可行的。唯一的问题是,当脚本被多次执行时,它取消了让scriptA的全局变量不持久化的功能。i、 e.当多次运行try:i+=1(NameError:i=0除外)时,通常发生的情况(当脚本未修改时)是每次执行时,i将递增。这种格式看起来很糟糕。抱歉,现在你说变量是在函数中定义的,而你之前说它不是在函数中声明的。你在自相矛盾,你需要发布真实的代码并提出具体的问题,而不是一般的问题。嘿,我说的是函数中没有定义的变量。你为什么不尝试将scriptA和scriptB转换成适当的类?如果您的脚本中包含对象方法,这将是微不足道的。为什么不使用类和对象呢?我有一个pyhton编辑器,用户可以在其中输入脚本。我必须通过setTrace函数检查脚本执行了多长时间。我通过将脚本放在scriptB的主方法中来实现这一点,否则它将无法工作。这在很大程度上是可行的。唯一的问题是,当脚本被多次执行时,它取消了让scriptA的全局变量不持久化的功能。i、 e.当多次运行try:i+=1(NameError:i=0除外)时,通常发生的情况(当脚本未修改时)是每次执行时,i将递增。这种格式看起来很糟糕。抱歉,现在你说变量是在函数中定义的,而你之前说它不是在函数中声明的。你在自相矛盾,你需要发布真实的代码并提出具体的问题,而不是一般的问题。嘿,我说的是函数中没有定义的变量……或者你是在试图使其持久化,即跟踪脚本执行之间的值?也许你想用泡菜做这个……或者你想让它持久化