我创建了一个函数,该函数可以使用一个参数来定义另一个操作列表的调用。例如,如果我直接调用sliprotor(Rotorid1,1),则可以根据需要操作Rotorid1列表。功能如下:
Qualtrics.SurveyEngine.addOnload(function()
{
var space = $$('.image')[0].cumulativeOffset().top;
console.log(space);
window.addEventListener("scroll", function(){
if( document.body.scrollTop > space){
$$('.image')[0].addClassName('fixed');
$$('.image_spacer')[0].addClassName('fixed');
}
else{
$$('.image')[0].removeClassName('fixed');
$$('.image_spacer')[0].removeClassName('fixed');
}
});
});
然而,如果我试图间接地打电话给这个'通过构建列表名称然后执行它,< rotid'不会被转换为值,因为它是直接调用的。
我这样做的方式是
def sliprotor(rotorid,offset_qty):
for movers in range(26,0,-1):
rotorid[movers-1+offset_qty]=rotorid[movers-1]
for movers_refill in range(offset_qty):
rotorid[movers_refill]=rotorid[movers_refill+26]
所以'间接' call不会将set_curr_rotor函数创建的值传递给sliprotor函数。直接调用确实使用传入的值。
如果我查看调试,您可以看到它直接调用rotorid []作为列表,而不是Rotorid1或其他Rotoridx,因此我得到索引错误。
.... 文件"",第3行,在sliprotor中 rotorid [动机-1 + offset_qty] = rotorid [动机-1] IndexError:字符串索引超出范围
我可以重构我的代码方式,但我不愿意。我缺少一些方法/范围问题吗?这只是Python的内在属性吗?我对Python很陌生,所以我只是在做一个Enigma机器模型练习。
任何帮助表示赞赏。 编
答案 0 :(得分:1)
我假设您已经定义了您的转子,如下所示:
Rotorid1 = list('abcdefghijklmnopqrstuvwxyz')
Rotorid2 = list('abcdefghijklmnopqrstuvwxyz')
现在你不愿意改变这一点,因为......原因。
没关系。但你还是错了。您需要做的是创建一个更大的数据结构。你可以这样做:
Rotors = [ Rotorid1, Rotorid2, ... ]
现在你有一个列表清单。 Rotors
变量现在包含所有各种Rotorid
变量。 (好吧,它引用了它们。但是那样做了。)
您可以简单地传入索引编号,而不是将变量名称作为转子的句柄传递:
def set_rotor(id):
global Current_rotor
Current_rotor = id
def slip_rotor(amount):
global Current_rotor
global Rotors
rotor = Rotors[Current_rotor]
for movers in range(26,0,-1):
rotor[movers-1+offset_qty]=rotor[movers-1]
# etc...
另外,请确保在Python中查找slicings - 您可以通过使用切片操作子列表和子字符串来做很多事情。