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'以使跟踪函数工作”非常模糊,但听起来您想要的是:
- 从用户处获取输入
- 在某个持久上下文中执行它
- 如果执行时间过长,则中止执行
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'以使跟踪函数工作”非常模糊,但听起来您想要的是:
- 从用户处获取输入
- 在某个持久上下文中执行它
- 如果执行时间过长,则中止执行
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']
要使变量成为全局变量,需要做两件事
i = 0
def inc_i():
global i
i += 1
要使变量成为全局变量,需要做两件事
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将递增。这种格式看起来很糟糕。抱歉,现在你说变量是在函数中定义的,而你之前说它不是在函数中声明的。你在自相矛盾,你需要发布真实的代码并提出具体的问题,而不是一般的问题。嘿,我说的是函数中没有定义的变量……或者你是在试图使其持久化,即跟踪脚本执行之间的值?也许你想用泡菜做这个……或者你想让它持久化