如何访问父python函数末尾的if/elif语句中定义的变量?

如何访问父python函数末尾的if/elif语句中定义的变量?,python,variables,if-statement,scope,global-variables,Python,Variables,If Statement,Scope,Global Variables,如何在父python(3.6)函数中进一步引用if/elif语句中定义的变量 例如,下面是我的代码模型-我正在尝试“打印”或“使用”下面每个“if”和“elif”块中定义的变量,在函数末尾,包含定义变量的if/elif语句,但是,当我运行代码时,pycharm中出现了一个未解决的引用错误和以下python错误: UnboundLocalError: local variable 'a1_summary' referenced before assignment 我对python和编码比

如何在父python(3.6)函数中进一步引用if/elif语句中定义的变量

例如,下面是我的代码模型-我正在尝试“打印”或“使用”下面每个“if”和“elif”块中定义的变量,在函数末尾,包含定义变量的if/elif语句,但是,当我运行代码时,pycharm中出现了一个未解决的引用错误和以下python错误:

    UnboundLocalError: local variable 'a1_summary' referenced before assignment
我对python和编码比较陌生,不知道哪里出了问题,因为我希望变量是在同一个函数中定义的,那么它们应该对函数末尾的print语句“可见”

这是应该使用全局变量的情况吗

def Process_Data(incoming_data):

      if incoming_data.count(',') == 2:
         data_summary = incoming_data.split(',')
         a1_summary, b1_summary = data_summary[0], data_summary[1]

      elif incoming_body.count(',') == 3:
           data_summary = incoming_data.split(',')
           a2_summary, b2_summary, c2_summary = data_summary[0], data_summary[1], data_summary[2]

      print(a1_summary, b1_summary, a2_summary, b2_summary, c2_summary )

      else:
           pass
非常感谢您的帮助或建议-谢谢

更新至上述内容

我试图保持问题的简单性,但可能会混淆问题,因为我试图在处理rabbitmq消息队列中消息的函数中使用if/elif语句-我需要根据相应消息中逗号的数量处理消息,并将消息的部分分配给变量,然后聚合if/elif语句接收和处理的每条消息的一部分放入一个数组中,以便稍后在程序中将其传递给另一个函数


我可能会错误地认为,每当函数接收到与if或elif语句匹配的传入_数据时,与其他条件匹配的任何以前或新数据仍将作为变量保存在函数中,例如,我认为函数保存来自if/elif块的变量,并且只更新任何由相应逻辑语句处理的新数据

由于作用域,您必须在if/elif块外部定义它们,然后在内部重新定义它们

看看你的代码,我认为你想做的事情可以更有效地完成,并修复你的错误。看起来您正试图用逗号分割输入,然后打印每个元素。您可以将它们放在列表中,然后打印列表,而不是执行您现在正在执行的操作。我想这会满足你的要求

def Process_Data(incoming_data):
    print(*incoming_data.split(","))
我真的不知道你为什么要这样做,因为它除了用空格替换逗号之外,实际上什么都不会做。如果要返回带有结果的元组,请将打印替换为

    return(tuple(incoming_data.split(",")))
您还可以将其制作为lambda:

Process_data = lambda incoming_data: print(*incoming_data.split(","))


如果您想根据数字更改变量的类型,这是绝对可以做到的

def Process_Data(incoming_data):
    data_input = incoming_data.split(",")
    if len(data_input) == 3:
         dataA, dataB, dataC = int(data_input[0]), str(data_input[1]), int(data_table[2])
    elif len(data_input) == 2:
         dataA, dataB, dataC = str(data_input[0]), int(data_input[1]), None
    return(dataA, dataB, dataC)

您可以根据需要更改所需输出的类型。这与您所做的非常相似,只是稍微短了一点,并将剩余的数据点定义为无。

代码的问题是,
a1\u summary
b1\u summary
仅在传入数据包含两个逗号时定义,在本例中,
a2\u摘要
b2\u摘要
c2\u摘要
将永远无法定义

如果输入中有3个逗号,则会出现相反的问题-如果少于2个或多于3个逗号,则两者都会出现

所以,不管你的输入是什么,你的一些变量永远不会被定义

这里绝对没有范围问题。如果您想了解Python 3中作用域的更多信息,可以查看

为了解决您的问题,您可以在函数的开头为这些变量提供默认值。例如,这可能是一个空字符串

a1_summary = b1_summary = a2_summary = b2_summary = c2_summary = ''
然后,无论您的代码采用什么路径,所有变量都将在某个点上定义

如果此代码:

def Process_Data(incoming_data):

      if incoming_data.count(',') == 2:
         data_summary = incoming_data.split(',')
         a1_summary, b1_summary = data_summary[0], data_summary[1]

      elif incoming_body.count(',') == 3:
           data_summary = incoming_data.split(',')
           a2_summary, b2_summary, c2_summary = data_summary[0], data_summary[1], data_summary[2]

      print(a1_summary, b1_summary, a2_summary, b2_summary, c2_summary )
导致此错误的原因:

UnboundLocalError: local variable 'a1_summary' referenced before assignment
这只能是因为当您尝试在
print
语句中使用
a1_summary
时,没有为其赋值

您分配给
a1\u summary
的唯一位置在该块中:

if incoming_data.count(',') == 2:
     data_summary = incoming_data.split(',')
     a1_summary, b1_summary = data_summary[0], data_summary[1]
     ^^^^^^^^^^
因此,此代码尚未执行,这意味着
传入的_数据.count(',')
不等于
2

这也是在函数顶部初始化
a1_summary=“
等时“值似乎没有更新”的原因

如果希望函数记住以前的值,则应使用类,例如

class DataProcessor(object):
    def __init__(self):
        self.a1 = self.a2 = self.b1 = self.b2 = self.c2 = ""

    def process(incoming_data):
        comma_count = incoming_data.count(',')
        if comma_count == 2:
            self.a1, self.b1 = data_summary[0], data_summary[1]
        elif comma_count == 3:
            self.a2, self.b2, self.c2 = ... you get the point...
        else:
            pass  # or log if it's an error condition
        self.print_summary()

    def print_summary(self):
        print(self.a1, self.b1, self.a2, self.b2, self.c2)
用法:

dp = DataProcessor()
...
dp.process(data)
如果不想更改API,可以调用
过程
方法
\uuu调用
,然后将其用作:

Process_Data = DataProcessor()  # keep original function name
...
Process_Data(data)  # calls DataProcessor.__call_

感谢所有对我的问题发表评论的人,你给了我思考的食物,但我似乎找到了解决问题的方法,如下所示:

我创建了一个config.py文件并在其中定义了变量,例如

config.py

a1_summary = ""
b1_summary = ""

a2_summary = ""
b2_summary = ""
c2_summary = ""
然后,在我的“main”python脚本文件中,我导入了“config”,并使用前缀“config”引用了它包含的变量。在我的函数中,来自原始示例的更新代码如下所示:

import config
...

def Process_Data(incoming_data):

  if incoming_data.count(',') == 2:
     data_summary = incoming_data.split(',')
     config.a1_summary, config.b1_summary = config.data_summary[0], config.data_summary[1]

  elif incoming_body.count(',') == 3:
       data_summary = incoming_data.split(',')
       config.a2_summary, config.b2_summary, config.c2_summary = config.data_summary[0], config.data_summary[1], config.data_summary[2]

  print(config.a1_summary, config.b1_summary, config.a2_summary, config.b2_summary, config.c2_summary )

  else:
       pass
现在,我可以将每个if/elif语句中的值聚合到代码底部的print语句中

我认为使用上面Bjorn建议的类可能是实现这一点的首选方法,但是由于我对python/编码还不熟悉,目前这有点超出我的理解,上面的解决方案允许我做目前需要做的事情

我意识到我需要学习更多关于类的知识,并打算这样做,因为我认为使用这些类会更加优雅,并且不再需要外部config.py文件


我希望这对那些目前与我处境相似的人可能有用。

在if之外使用默认值定义它们,然后在if中重新分配它们。谢谢,但我已经尝试在函数的开头定义a1_summary=''和b1_summary='',但是当if/elif语句进行处理时,值似乎没有得到更新-print语句只“打印”两个空格,然后是值
import config
...

def Process_Data(incoming_data):

  if incoming_data.count(',') == 2:
     data_summary = incoming_data.split(',')
     config.a1_summary, config.b1_summary = config.data_summary[0], config.data_summary[1]

  elif incoming_body.count(',') == 3:
       data_summary = incoming_data.split(',')
       config.a2_summary, config.b2_summary, config.c2_summary = config.data_summary[0], config.data_summary[1], config.data_summary[2]

  print(config.a1_summary, config.b1_summary, config.a2_summary, config.b2_summary, config.c2_summary )

  else:
       pass