【问题标题】:Why can't I use loop 'for i in...' in a definition? (Local Variable i not used)为什么我不能在定义中使用循环'for i in...'? (我没有使用局部变量)
【发布时间】:2019-07-15 12:53:26
【问题描述】:

我是 Python 和编码的新手,正在网上做一些练习。

我正在编写一个用于制作随机数列表的类:

class RandomList:
    def create_list(self):
        self.list = []
    def fill_list(self, min, max, range):
        self.list = [random.randint(min, max) for i in range(range)]

首先 --> 看不懂self.list = []下的Pycharm警告信息 告诉我:

“实例属性列表在init之外定义”

如果我写会有什么不同:

class RandomList:
    def __init__(self):
        self.list = []

其次 --> 当我调用RandomList.fill_list时fill_list函数不起作用:

TypeError: 'int' 对象不可调用。

并且'i'下面有警告信息:

未使用局部变量

我不明白为什么

我在这里不知所措,因为当我使用例如:

a = [random.randint(min, max) for i in range(range)]

在课堂之外没有任何问题。我想我一定是把事情搞混了......

【问题讨论】:

    标签: python for-loop pycharm local-variables


    【解决方案1】:
    1. PEP8 约定仅在 __init__ 内初始化实例属性。否则代码会变得一团糟,无法跟踪和调试,尤其是对于那些没有编写代码的人。

    2. 你会收到i 未被使用的警告,因为你没有使用它。使用_,这是丢弃变量的事实标准,或使用self.list = [random.randint(min, max)] * range,但range 是一个错误的变量名称('min' 和'max' 也是如此),参见第 3 点。

    3. 您会收到错误 TypeError: 'int' object is not callable.,因为您在方法中使用 range 参数覆盖了 range 中的构建。 minmax 也是内置函数,不应用于变量名。

    【讨论】:

      【解决方案2】:

      这里(range是保留字)

      import random 
      class RandomList:
          def __init__(self, min, max, _range):
              self.lst = [random.randint(min, max) for i in range(_range)]
      
      rl = RandomList(4,7,10)
      print(rl.lst)
      

      输出

      [5, 4, 5, 6, 6, 4, 4, 6, 7, 6]
      

      【讨论】:

      • range 是一个内置类,而不是保留字(如果它被保留,那么您将无法如此轻松地覆盖它)
      【解决方案3】:

      首先:你不能使用带有 min、max、range 的变量名

      例子:

      range = 4
      for i in range(range): #you will get error
          print("Hello!")
      

      你的代码应该是

      class RandomList:
          def create_list(self):
              self.list = []
          def fill_list(self, minnum, maxnum, rangenum):
              self.list = [random.randint(minnum, maxnum) for i in range(rangenum)]
      

      你可以用它来测试它

      randlist = RandomList
      randlist.create_list(randlist)
      randlist.fill_list(randlist, 1, 5, 3)
      
      print(randlist.list) #prints randomly like [1, 4, 3]
      

      【讨论】:

      • 感谢您的回答-您为什么需要将“randList”作为参数传递,不知何故,我认为 Python 理解“自我”本身(没有双关语)另外,只是想知道 python 是如何知道什么的.list 在print(randlist.list) 再次感谢:)
      • randlist.create_list 是一个函数,无法检测 randList 是一个变量。例如,如果您创建一个名为“testList”的类并在其中定义一个名为“list”的空列表。您可以使用“fill_list”功能。您可以RandomList.fill_list(testList, 1, 5, 3) 并使用mylist = testList.list 获取您的列表并使用print(mylist) 打印它
      • 抱歉我的英语不好。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-02
      相关资源
      最近更新 更多