【问题标题】:Python 2.7: Function accessing a listPython 2.7:访问列表的函数
【发布时间】:2012-07-25 19:50:07
【问题描述】:

我正在使用带有 SimPy 模块的 Python2.7,第一次在这里发帖。 我只是在学习它们,所以我希望我能正确解释这一点。 我的程序的目标: 创建一个 Demand 对象并每周生成一个数字。 将其存储在列表中。 根据需求对象创建的数字,创建一个 Supply 对象并每周生成一个数字。 我似乎能够创建我的 52 个号码,并将它们附加到一个列表中,但我无法成功地让 Supply 对象通读该列表。 我的代码如下:

from SimPy.Simulation import *
import pylab as pyl
from random import Random
import matplotlib.mlab as mlab
import matplotlib.pyplot as plt
# Model components
runLength = 51

## Lists for examination
D1Vals = []
S1Vals = []

.... other code lines

class Demander(Process):

# This object creates the demand, and stores the values in the 'D1Vals' list above

def weeklyDemand(self):  # Demand Weekly
    while True:
            lead = 1.0      # time between demand requests
            demand = random.triangular(20,110,370)  # amount demanded each increment
            #yield put, self, orderBook, delivery
            print('Week'+'%6.0f: Need %6.0f units: Total Demand = %6.0f' %
                    (now(), demand, orderBook.amount))
            yield hold, self, lead
            yield put, self, orderBook, demand
            D1Vals.append(demand)

# This object is trying to read each value iteratively in D1Vals, 
  and create a supply value and store in a list 'S1Vals'

class Supplier(Process):

def supply_rate(self):
    lead = 1.0
    for x in D1Vals:
            supply = random.triangular(x - 30, x , x + 30)               
            yield put, self, stocked, supply
            print('Week'+'%6.0f: Gave %6.0f units: Inv. Created = %6.0f' %
                    (now(), supply,stocked.amount))
            yield hold, self, lead
            S1Vals.append(stocked.amount)

..... other misc coding .....

# Model
demand_1 = Demander()
activate(demand_1, demand_1.weeklyDemand())
supply_1 = Supplier()
activate(supply_1, supply_1.supply_rate())
simulate(until=runLength)

当我运行我的程序时,它会创建我的需求并将每周和累积值输出到控制台,它还会为我打印 D1Vals 列表以查看它是否为空。

任何人都可以指导我成功地从供应商对象和函数中读取列表的正确路径。 谢谢,请原谅我对 python 的明显“新鲜”展望;)

【问题讨论】:

  • 您对 supply_rate() 和 weekDemand() 方法的缩进搞砸了

标签: python list for-loop


【解决方案1】:

D1ValsS1Vals 在模块范围内定义; 你应该能够写出像这样的表达式 x=S1Vals[-7:] 在该模块中的任何位置都没有问题。

这适用于访问和改变这些变量的值, 这样

def append_supply( s ):
    S1Vals.append(s)

应该可以。

但是,要分配给它们,您需要将它们声明为全局

def erase_supply():
    '''Clear the list of supply values'''
    global S1Vals
    S1Vals = []

如果global S1Vals 行被省略,结果将是函数本地 变量S1Vals 由赋值语句定义,隐藏模块级 同名变量。

避免使用 global 语句的一种方法是使用实​​际的模块名称 引用这些变量。我假设您的代码定义在 SupplyAndDemandModel.py.

你可以在这个文件的顶部放

import SupplyAndDemandModel

然后使用模块名称引用那些模块范围的变量:

SupplyAndDemandModel.S1Vals = []

这提供了一种明确指示您正在访问/修改模块级变量的方法。

【讨论】:

  • @Colin :谢谢,在我的实际程序中没问题。
  • @Dave 感谢您抽出宝贵时间,尽管在我的学习曲线的这个阶段对我来说似乎有点复杂。我希望为我的“初学者”编码找到一个修复方法。我注意到的另一件事是,如果我用任何随机数手动填充 D1Vals,那么程序就可以工作(即使 len(D1Vals) 现在是 52 而不是 51)。继续努力,仍然感谢任何帮助
  • @戴夫。根据您的建议,我能够通过将 list 声明为全局来获得结果,并且每次访问 list 时,它都会删除该条目。所以这是一个值得学习的练习,因为它迫使我了解我可以从哪里访问变量。谢谢。不知道我是否打算发布工作代码?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-16
  • 1970-01-01
  • 1970-01-01
  • 2016-06-09
  • 1970-01-01
  • 2013-05-11
相关资源
最近更新 更多