如何在Python中的嵌套函数中正确引用全局变量

时间:2017-07-26 19:17:17

标签: python global-scope

假设我有以下简单的情况:

lapply

这导致以下追溯:

[HttpPost]
    public ActionResult NewRoster(RosterView rosterView){
        rosterView = Session["rosterView"] as RosterView;
        //(Validations)
        var employeeID = Request["EmployeeID"].ToString();
        if (employeeID.Equals("")){
            ViewEmployee();
            ViewBag.Error = "Debe seleccionar un empleado";
            return View(rosterView);}
        var employee = db.Employees.Find(employeeID);
        if (employee.Equals("")){
            ViewEmployee();
            ViewBag.Error = "El empleado no existe";
            return View(rosterView);}
        if (rosterView.Perceptions.Count == 0){
            ViewEmployee();
            ViewBag.Error = "Debe ingresar una percepción";
            return View(rosterView);}
        if (rosterView.Deductions.Count == 0){
            ViewEmployee();
            ViewBag.Error = "Debe ingresar una deducción";
            return View(rosterView);}
        //(End Validations)

        //(Start the transaction)
        string rosterID = Guid.NewGuid().ToString();
        using (var transaction = db.Database.BeginTransaction()){
            try{
                var roster = new Roster
                {
                    RosterID = rosterID,
                    EmployeeID = employeeID,
                    RosterDate = DateTime.Now,
                    LastRosterDate = DateTime.Now,
                    StartRosterDate = DateTime.Now,
                    RosterStatus = RosterStatus.Created
                };
                db.Rosters.Add(roster);
                db.SaveChanges();

                string rosterDetailID = Guid.NewGuid().ToString();

                //(THIS WORKS BY ITSELF BUT NOT WITH THE SECOND ↓ FOREACH)
                foreach (var p in rosterView.Perceptions){
                    var rosterDetail = new RosterDetail(){
                        RosterDetailID = rosterDetailID,
                        RosterID = rosterID,
                        ID = p.PerceptionID,
                        Concept = p.Concepto,
                        Amount = p.AmountE,
                        AmountE = p.AmountG,
                        Key = p.PerceptionKey};
                    db.RosterDetails.Add(rosterDetail);
                    db.SaveChanges();
                }

                //(THIS WORKS BY ITSELF BUT NOT WITH THE FIRST ↑ FOREACH)
                foreach (var d in rosterView.Deductions)
                {
                    var rosterDetaild = new RosterDetail()
                    {
                        RosterDetailID = rosterDetailID,
                        RosterID = rosterID,
                        ID = d.DeductionID,
                        Concept = d.DeductionConcept,
                        Amount = d.Amount,
                        AmountE = 0,
                        Key = d.DeductionKey};
                    db.RosterDetails.Add(rosterDetaild);
                    db.SaveChanges();}}
            catch (Exception ex){
                transaction.Rollback();
                ViewBag.Error = "Error: " + ex.Message;
                ViewEmployee();
                return View(rosterView);}
            transaction.Commit();}

        ViewBag.Message = string.Format("La nómina se guardó correctamente ", rosterID);
        ViewEmployee();
        rosterView = new RosterView();
        rosterView.Employee = new Employee();
        rosterView.Perceptions = new List<PerceptionOrder>();
        rosterView.Deductions = new List<DeductionOrder>();
        Session["rosterView"] = rosterView;
        return View(rosterView);}

我知道我可以将import pandas as pd def multiply(row): global results results.append(row[0] * row[1]) def main(): results = [] df = pd.DataFrame([{'a': 1, 'b': 2}, {'a': 3, 'b': 4}, {'a': 5, 'b': 6}]) df.apply(multiply, axis=1) print(results) if __name__ == '__main__': main() 移动到Traceback (most recent call last): File "<ipython-input-2-58ca95c5b364>", line 1, in <module> main() File "<ipython-input-1-9bb1bda9e141>", line 11, in main df.apply(multiply, axis=1) File "C:\Users\bbritten\AppData\Local\Continuum\Anaconda3\lib\site-packages\pandas\core\frame.py", line 4262, in apply ignore_failures=ignore_failures) File "C:\Users\bbritten\AppData\Local\Continuum\Anaconda3\lib\site-packages\pandas\core\frame.py", line 4358, in _apply_standard results[i] = func(v) File "<ipython-input-1-9bb1bda9e141>", line 5, in multiply results.append(row[0] * row[1]) NameError: ("name 'results' is not defined", 'occurred at index 0') 语句以使这个示例正常工作,但有没有办法保留我现在拥有的结构并使其有效?

2 个答案:

答案 0 :(得分:4)

您必须在以下函数之外声明结果:

import pandas as pd

results = []

def multiply(row):
    # the rest of your code...

更新

另请注意,python中的list是可变的,因此您无需在函数的开头使用global指定它。实施例

def multiply(row):
    # global results -> This is not necessary!
    results.append(row[0] * row[1])

答案 1 :(得分:0)

您必须将结果移到函数之外。如果不移动变量,我认为没有任何其他方法。

一种方法是将结果作为参数传递给乘法方法。