python中嵌套if语句中的作用域

python中嵌套if语句中的作用域,python,if-statement,scope,Python,If Statement,Scope,我正在写一小段代码,解析latex文件,并给出定义的newcommands。一个测试用例就是这个简单的latex文件: % +--------------------------------------------------------------------+ % | | % | New particle stuff

我正在写一小段代码,解析latex文件,并给出定义的newcommands。一个测试用例就是这个简单的latex文件:

% +--------------------------------------------------------------------+
% |                                                                    |
% |  New particle stuff                                                |
% |                                                                    |
% +--------------------------------------------------------------------+
\newcommand*{\Hmp}{\ensuremath{H^{\mp}}\xspace}
\newcommand*{\susy}[1]{\ensuremath{\tilde{#1}}\xspace}
\newcommand*{\susy2}[1,2]{\ensuremath{\tilde{#1}\tilde{#2}}\xspace}
可能有一种更复杂的情况,命令会扩展几行,因此我需要跟踪不同的步骤,比如命令是否需要增加更多行,或者命令何时完成并准备完成

问题是,在几个嵌套的if/else语句中,变量的范围似乎丢失了,变量不再更新。以下是我正在做的事情:

    macros = []
    warg_keep = re.compile("newcommand\*\{(.*)\}\[(.*)\]\{(.*)")
    woarg_keep = re.compile("newcommand\*\{(.*)\}\{(.*)")
    warg_one = re.compile("newcommand\*\{(.*)\}\[(.*)\]\{(.*)\}")
    woarg_one = woarg = re.compile("newcommand\*\{(.*)\}\{(.*)\}") 
    keep = False
    for line in open(file).readlines():
        line = line.strip()
        if len(line) == 0 or line[0] == "%":
            continue
        if not keep:
            newcommand = {"key":"","command":"","args":[]}
        added = False
        if "newcommand" in line:
            if line[-1] == "%":
                clean_line = line[0:-1]
                keep = True
                newcommand = get_cmd_from_line(warg_keep,woarg_keep,clean_line)
            else:
                newcommand = get_cmd_from_line(warg_one, woarg_one, line)
                added = True
        elif keep:
            # Now it dos not matter how it ends, the command will always be added the line without the
            # last character, it can be either % or } but it shouldn't be added
            newcommand["command"] += line[0:-1]
            # End the keep
            if line[-1] != "%":
                keep = False
                added = True
        elif added:
            macros.append(newcommand)
问题是,当我将从get_cmg_from_line函数(我已经测试过该函数工作得很好)获得的值分配给newcommand变量时,它不会更新newcommand变量,但如果我将其移到上一个变量上,它会识别并更新它。keep和添加的变量也会发生同样的情况

我搜索了这个,找到了很多关于作用域/如果/函数等的东西,我一直都知道,因为如果不应该定义作用域,我不知道为什么会发生这种情况。。。我错过了什么愚蠢的事吗?我应该如何更新newcommand变量的值?因为它可能会随着新线的到来而更新。我看到的唯一解决方案是扁平化代码,但我希望这样维护它

编辑:我对原始代码做了一点修改,以适应文本的额外功能,但在不展平代码的情况下,它也不起作用。所以上面的代码不起作用,原因是我提到的。以下代码工作正常,并通过了所有测试:

macros = []
warg_keep = re.compile("newcommand\*\{(.*)\}\[(.*)\]\{(.*)")
woarg_keep = re.compile("newcommand\*\{(.*)\}\{(.*)")
warg_one = re.compile("newcommand\*\{(.*)\}\[(.*)\]\{(.*)\}")
woarg_one = woarg = re.compile("newcommand\*\{(.*)\}\{(.*)\}")
keep = False
for line in open(file).readlines():
    line = line.strip()
    if len(line) == 0 or line[0] == "%":
        continue
    if not keep:
        newcommand = {"key":"","command":"","args":[]}
    added = False
    if "newcommand" in line and line [-1] == "%":
        clean_line = line[0:-1]
        keep = True
        newcommand = get_cmd_from_line(warg_keep,woarg_keep,clean_line)
    if "newcommand" in line and line[-1] != "%":
        newcommand = get_cmd_from_line(warg_one, woarg_one, line)
        added = True
    if not "newcommand" in line and keep:
        # Now it dos not matter how it ends, the command will always be added the line without the
        # last character, it can be either % or } but it shouldn't be added
        newcommand["command"] += line[0:-1]            
    if not "newcommand" in line and keep and line[-1] != "%":
        # End the keep
        keep = False
        added = True
    if added:
        macros.append(newcommand)

Python中局部变量的作用域(与许多其他脚本语言一样)是函数级的,而不是块级的

例如:

def function():
    x = 5
    if True:
        y = 8
    print(x)
    print(y)

function()
# -> 5
# -> 8

Python中局部变量的作用域(与许多其他脚本语言一样)是函数级的,而不是块级的

例如:

def function():
    x = 5
    if True:
        y = 8
    print(x)
    print(y)

function()
# -> 5
# -> 8

粗略检查一下,我的第一个猜测是
elif keep
elif added
应该分别是
if keep
if added


另一种可能是,您希望newcommand从一行累积到下一行,但每次传递时都会重置它。粗略检查时,我的第一个猜测是,
elif keep
elif added
应该分别是
if keep
if added


另一种可能是,您希望newcommand从一行累积到下一行,但每次传递时都会重置它。是否应将
newcommand={…}
移动到
for line in…:
前面?

为了获得新命令,我需要检查该行。我一直在调试代码,它做了它应该做的事情,在这个意义上,它进入了块,调用了函数,并且正确地关联了newcommand(!!),但是在离开块之后,所有变量(newcommand,keep和added)仍然保留旧值。如果第[-1]==“%”行中的第一个
设置为
True
,脚本应该怎么做?它是否也应该放在
elif keep
内,还是只放在下一行?因为这在Python中不起作用,正如答案中所提到的。不,如果keep设置为true,那么它应该只用于下一行,当“newcommand”在该行中并且keep应该设置为true时,情况就不是这样了。keep仅用于知道“newcommand”出现后的下一行是否应用于增加newcommand变量。作为mentioend,一步一步地调试代码,它按原样工作。变量赋值被记录在第二个块之外。如果我把它们移动到一个左右的位置,或者将代码展平,那么它就工作了。。。这就向我指出,我并不是对块中的作用域有什么不确定的,没有块作用域。所有局部变量都是函数作用域。不管你的问题是什么,它都不是作用域。我不确定问题是什么,但是将代码扁平化可以完美地工作。我将编辑问题和答案,以防有人能找出问题是什么,这真的很好知道。为了得到新的命令,我需要检查行。我一直在调试代码,它做了它应该做的事情,在这个意义上,它进入了块,调用了函数,并且正确地关联了newcommand(!!),但是在离开块之后,所有变量(newcommand,keep和added)仍然保留旧值。如果第[-1]==“%”
行中的第一个
设置为
True
,脚本应该怎么做?它是否也应该放在
elif keep
内,还是只放在下一行?因为这在Python中不起作用,正如答案中所提到的。不,如果keep设置为true,那么它应该只用于下一行,当“newcommand”在该行中并且keep应该设置为true时,情况就不是这样了。keep仅用于知道“newcommand”出现后的下一行是否应用于增加newcommand变量。作为mentioend,一步一步地调试代码,它按原样工作。变量赋值被记录在第二个块之外。如果我把它们移动到一个左右的位置,或者将代码展平,那么它就工作了。。。这就向我指出,我并不是对块中的作用域有什么不确定的,没有块作用域。所有局部变量都是函数作用域。不管你的问题是什么,它都不是作用域。我不确定问题是什么,但是将代码扁平化可以完美地工作。我将编辑问题和答案,以防有人能找出问题所在。是的,我知道,这是我们希望这能起作用,但似乎在第二个区块内,变量无法识别。即使在pycharm中,它们也会显示为灰色,好像它们没有被使用。是的,我知道,这是我们,我希望这能起作用,但似乎在第二个街区内