Python Pass函数参数作为列表标识符

时间:2017-09-18 21:47:28

标签: python list function substitution

我创建了一个函数,该函数可以使用一个参数来定义另一个操作列表的调用。例如,如果我直接调用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机器模型练习。

任何帮助表示赞赏。 编

1 个答案:

答案 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 - 您可以通过使用切片操作子列表和子字符串来做很多事情。