【问题标题】:Iterating variables to change its features in Python在 Python 中迭代变量以改变其特性
【发布时间】:2010-07-28 21:52:25
【问题描述】:

我在循环中用 setattr() 函数赋值:

for i in range(30):
        for j in range(6):  
            setattr(self, "e"+str(i)+str(j), Entry(self.top))

,那么我想应用 .grid() 函数。所有这些变量都有一个循环。

例如,

self.e00.grid(row= 0, column= 0)

我该怎么做?

【问题讨论】:

    标签: python variables loops naming


    【解决方案1】:

    这不是处理事情的正确方法。做一个属性,把所有的数据都放进去。

    import numpy as np
    self.matrix = np.array( ( 6, 30 ), Entry( self.top ) )
    
    for row in self.matrix:
        for elt in row:
            elt.grid( ... )
    

    【讨论】:

    • 因为你可以有一个变量而不是 30*6 并且你可以在没有丑陋和缓慢的字符串操作 + getattr/setattr 的情况下操作元素。另外,因为它是完成这项工作的合适工具,而且已经存在 - 没有必要重新发明轮子。
    • numpy.array 给出错误:matrix = numpy.array( (6,10), Entry(root)) TypeError: data type not understand
    • 道歉;如果要在 numpy 数组中使用 Entry,则需要定义自定义 dtypestackoverflow.com/questions/2350072/…。如果您不介意,请使用 ~unutbu 对列表列表的建议——它会更慢,但在这个大小上它并不重要。
    【解决方案2】:

    使用getattr():

    getattr(self, "e00").grid(row=0, column=0)
    

    或相应地在一个循环中:

    getattr(self, "e"+str(i)+str(j)).grid(row=0, column=0)
    

    虽然可能有更好的解决方案,这取决于您的代码实际在做什么。

    【讨论】:

      【解决方案3】:

      也许可以为您的矩阵使用列表列表:

      self.ematrix = [ [ Entry(self.top) for j in range(6)]  # columns
                                         for i in range(30)] # rows
      
      for i,row in enumerate(self.ematrix):
          for j,elt in enumerate(row):
              elt.grid(row=i,column=j)
      

      【讨论】:

        猜你喜欢
        • 2014-11-09
        • 2017-08-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-08-03
        • 1970-01-01
        相关资源
        最近更新 更多