【问题标题】:Python Pass function parameter as list identifierPython将函数参数作为列表标识符
【发布时间】:2017-09-18 21:47:28
【问题描述】:

我创建了一个函数,它可以接受一个参数,该参数定义另一个调用来操作列表。例如,如果我直接调用sliprotor(Rotorid1, 1),那么Rot​​orid1 列表就会按照我的意愿进行操作。函数如下:

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]   

但是,如果我尝试通过构建列表名称然后执行它来“间接”调用它,则“rotorid”不会像直接调用时那样转换为值。

我这样做的方式是

def set_curr_rotor(XX): 
    rotorid = "Rotorid"+str(XX)             
    return rotorid  

rid1 = input("First rotor slip : ")         
if(rid1): 
    sliprotor(set_curr_rotor(rid1),1)

所以“间接”调用不会将 set_curr_rotor 函数创建的值传递给 sliprotor 函数。直接调用确实使用传入的值。

如果我查看调试,您可以看到它直接调用rotorid[] 作为列表,而不是Rotorid1 或其他Rotoridx,因此我得到一个索引错误。

.... 文件“”,第 3 行,在sliprotor 中 rotorid[movers-1+offset_qty]=rotorid[movers-1] IndexError: 字符串索引超出范围

我可以重组我拥有代码的方式,但我不希望这样做。我缺少一些方法/范围问题吗?这只是 Python 的内在属性吗?我对 Python 很陌生,所以我只是在做一个模拟 Enigma 机器的练习。

任何帮助表示赞赏。 埃德

【问题讨论】:

  • 不要这样做。这是糟糕的设计。请改用容器
  • 从根本上说,不要将字符串对象与变量名混为一谈。你可以使用各种巫术来做到这一点,但同样,这是非常非常糟糕的做法。
  • 将您的列表保存在字典中。然后你可以将键作为字符串来访问字典中的列表。
  • 我将研究使用列表字典。谢谢

标签: python list function substitution


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

【讨论】:

  • 如果他的字典索引(或列表)有问题,我认为检查元素是否存在于列表中(或键是否存在于字典中)会很有用
  • 您好,感谢您的回复。实际上,我的转子是列表的列表,但我对更改它们没有哲学上的反对。我会这样做的。确实只是一个问题,以确认我正在尝试的内容不受支持,而事实并非如此,所以我会考虑替代方案。
  • 好的,所以我认为我关于在 python 列表中可以做什么或不能做什么的基本假设是错误的。您似乎无法检索一个列表中保存的名称作为另一个列表的参考。即如果我有 top_list = [l1,l2,l3] 和 l1=[[i11,i12,i13],[i21,i22,i23],[i31,i32,i33]], l2=[[m11,m12, m13],[m21,m22,m23],[m31,m32,m33]], l3= [[o11,o12,o13],[o21,o22,o23],[o31,o32,o33]] 我指的是to top_list[0] 我不能将它用作对 l1 的引用,它允许我访问其中的列表。
  • 如果您要存储参考文献,您可以。您不想存储文字字符串。
  • 我将创建一个 3 深度列表。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-04-03
  • 2011-06-26
  • 1970-01-01
  • 1970-01-01
  • 2020-12-12
  • 1970-01-01
  • 2011-01-20
相关资源
最近更新 更多