main()函数中调用的函数未更新全局变量的值

时间:2019-06-10 13:46:44

标签: python function

我定义了函数'actualizar_contadores()',当在main()函数中调用该函数时,它可以更新在脚本开头定义的所有变量的值。首先,我没有将实际变量作为参数传递给函数,但是导致了“分配前引用的局部变量”错误。然后我将引用作为参数传递,这个问题消失了,但是当我想查看结果时,它们并没有更新。我尝试返回一个元组并将其分配给变量以更新其值,但是它都不起作用,并且在赋值错误之前,我再次引用了局部变量。我该怎么办?


cant_motos = cant_autos = cant_camiones = 0
recaudacion_total = recaudacion_efectivo = recaudacion_telepeaje = 0
pasadas_primera_hora = pasadas_segunda_hora = pasadas_tercera_hora = pasadas_cuarta_hora = 0
cont_efectivo = cont_telepeaje = 0
patente_actual = ""
patente_nueva = ""


def actualizar_contadores(vehiculo, forma_de_pago, cant_motos,
                          cant_autos, cant_camiones,recaudacion_efectivo,
                          recaudacion_telepeaje,cont_efectivo,cont_telepeaje):
    if vehiculo == "Moto":
        cant_motos += 1
        if forma_de_pago == 1:
            recaudacion_efectivo += 20
            cont_efectivo += 1
        elif forma_de_pago== 2:
            recaudacion_telepeaje += 20
            cont_telepeaje += 1

    elif vehiculo == "Auto":
        cant_autos += 1
        if forma_de_pago == 1:
            recaudacion_efectivo += 40
            cont_efectivo += 1
        elif forma_de_pago == 2:
            recaudacion_telepeaje += 40
            cont_telepeaje += 1

    elif vehiculo == "Camion":
        cant_camiones += 1
        if forma_de_pago == 1:
            recaudacion_efectivo += 80
            cont_efectivo += 1
        elif forma_de_pago == 2:
            recaudacion_telepeaje += 80
            cont_telepeaje += 1



def main():

    # menu principal
    opcion = pedir_opcion(menu_principal, 4)
    while opcion != 4:
        while opcion != 3:
            if opcion == 1:
                carga = pedir_opcion(menu_ingreso_datos, 2)
                print("Ingrese la siguiente operacion: ")
                opcion = pedir_opcion(menu_principal, 4)

            elif opcion == 2:
                if carga == 1:
                    diferencia = 0
                    tiempo_inicial = time.time()
                    while diferencia < 32:
                        contar_pasadas(diferencia, pasadas_primera_hora,
                                        pasadas_segunda_hora,
                                        pasadas_tercera_hora,
                                        pasadas_cuarta_hora)

                        tipo_vehiculo = pedir_opcion(menu_vehiculos, 3)
                        if tipo_vehiculo == 1:
                            vehiculo = "Moto"
                        elif tipo_vehiculo == 2:
                            vehiculo = "Auto"
                        elif tipo_vehiculo == 3:
                            vehiculo = "Camion"

                        forma_de_pago = pedir_opcion(menu_forma_de_pago, 2)
                        if forma_de_pago == 2:
                            patente = pedir_patente()
                            patente_nueva = definir_patente_nueva(patente)

                        actualizar_contadores(vehiculo, forma_de_pago, cant_motos,
                                              cant_autos, cant_camiones, cont_efectivo,
                                              cont_telepeaje, recaudacion_efectivo,
                                              recaudacion_telepeaje)

                        tiempo_final = time.time()
                        diferencia = tiempo_final - tiempo_inicial

                elif carga == 2:
                    vehiculos = "Moto", "Auto", "Camion"
                    formas_de_pago = "Efectivo", "Telepeaje"
                    diferencia = 0
                    tiempo_inicial = time.time()
                    while diferencia < 4:
                        contar_pasadas(diferencia, pasadas_primera_hora,
                                        pasadas_segunda_hora,
                                        pasadas_tercera_hora,
                                        pasadas_cuarta_hora)

                        vehiculo = random.choice(vehiculos)
                        forma_de_pago = random.choice(formas_de_pago)

                        aviso_pasada = "{}. Pago con {}. Hora de pasada: {}.".format(vehiculo,
                                                                                                 forma_de_pago,
                                                                                                 str((round(diferencia / 60) + 1)))
                        if forma_de_pago == "Telepeaje":
                            patente = generar_patente()
                            aviso_pasada += "Patente: {}".format(patente)
                            patente_nueva = definir_patente_nueva(patente)

                        print(aviso_pasada)

                        actualizar_contadores(vehiculo, forma_de_pago, cant_motos,
                                              cant_autos, cant_camiones, cont_efectivo,
                                              cont_telepeaje, recaudacion_efectivo,
                                              recaudacion_telepeaje)

                        tiempo_final = time.time()
                        diferencia = tiempo_final - tiempo_inicial
                        time.sleep(random.randint(0,1))

                pago_mayor_uso = forma_de_pago_mas_usada(cont_telepeaje, cont_efectivo)
                promedio_pasadas_por_hora = round((cant_autos + cant_motos + cant_camiones) / 4, 2)
                hora_pico = definir_hora_pico(pasadas_primera_hora,
                                              pasadas_segunda_hora,
                                              pasadas_tercera_hora,
                                              pasadas_cuarta_hora)
                recaudacion_total = recaudacion_efectivo + recaudacion_telepeaje
                pases_totales = cant_motos + cant_autos + cant_camiones

                print("Ingrese la siguiente operacion: ")
                opcion = pedir_opcion(menu_principal, 4)

main()```

1 个答案:

答案 0 :(得分:0)

您不应通过参数将全局变量传递给函数。使用全局关键字。 这是一个示例:

x = 10
y = 20

def myFunc():
    global x
    x = 3
    y = 2

myFunc()
print(x, y) # output: 3 20