假设我有以下简单的情况:
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')
语句以使这个示例正常工作,但有没有办法保留我现在拥有的结构并使其有效?
答案 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)
您必须将结果移到函数之外。如果不移动变量,我认为没有任何其他方法。
一种方法是将结果作为参数传递给乘法方法。