我有3个列表:
years = [2013,2014,2015,2016,2017,2018]
GamsVars = ['scen_name','timefile']
settings = ['ScenarioA','s']
我有一个函数用于返回与设置完全相同的列表,但附加了相应条目的年份:
def AppendYearToSettings(year,GamsVarsIn,SettingsIn):
SettingsOut = SettingsIn
SettingsOut[GamsVarsIn.index('scen_name')] = SettingsIn[GamsVarsIn.index('scen_name')] + "\\" + str(year)
SettingsOut[GamsVarsIn.index('timefile')] = SettingsIn[GamsVarsIn.index('timefile')] + str(year)
return(SettingsOut)
当我在循环中测试函数时:
for y in years:
ysettings = AppendYearToSettings(y,GamsVars,settings)
print(ysettings)
我的ysettings
累计追加年数:
['ScenarioA\\2013', 's2013']
['ScenarioA\\2013\\2014', 's20132014']
['ScenarioA\\2013\\2014\\2015', 's201320142015']
['ScenarioA\\2013\\2014\\2015\\2016', 's2013201420152016']
['ScenarioA\\2013\\2014\\2015\\2016\\2017', 's20132014201520162017']
['ScenarioA\\2013\\2014\\2015\\2016\\2017\\2018', 's201320142015201620172018']
我已尝试明确禁止修改设置(原始设置),但似乎我的功能以某种方式修改了设置。
导致此问题的原因是什么?
答案 0 :(得分:2)
导致此问题的原因是什么?
当您执行SettingsOut = SettingsIn
时,您只是创建了对SettingsIn
引用的对象的另一个引用。如果要复制列表,可以执行以下操作:
SettingsOut = SettingsIn[:]
或者,您可以使用copy.deepcopy(您需要导入copy
才能使用此功能)。只有当列表的元素本身是引用时,您才需要它,并且您还想创建对象的新副本。请看下面John Y的评论。
SettingsOut = copy.deepcopy(SettingsIn)
检查出来:
>>> l1 = [1, 2, 3, 4, 5]
>>> l2 = l1
>>> l2 is l1
True
>>> id(l1)
24640248
>>> id(l2)
24640248
>>> l2 = l1[:]
>>> l2 is l1
False
>>> id(l2)
24880432
>>> id(l1)
24640248
>>>
所以你的功能可能是这样的:
def AppendYearToSettings(year,GamsVarsIn,SettingsIn):
SettingsOut = SettingsIn[:]
SettingsOut[GamsVarsIn.index('scen_name')] = SettingsIn[GamsVarsIn.index('scen_name')] + "\\" + str(year)
SettingsOut[GamsVarsIn.index('timefile')] = SettingsIn[GamsVarsIn.index('timefile')] + str(year)
return SettingsOut
for y in years:
ysettings = AppendYearToSettings(y, GamsVars, settings)
print(ysettings)
输出:
['ScenarioA\\2013', 's2013']
['ScenarioA\\2014', 's2014']
['ScenarioA\\2015', 's2015']
['ScenarioA\\2016', 's2016']
['ScenarioA\\2017', 's2017']
['ScenarioA\\2018', 's2018']
有点误入歧途,但你应该看一下PEP style guide for function naming ;-)它说:
功能名称
函数名称应为小写,带有单词 必要时用下划线分隔以提高可读性。
只允许在已经存在的情况下使用mixedCase 主流风格(例如threading.py),向后保留 兼容性。