【问题标题】:Overloaded variables in python for loops?python for循环中的重载变量?
【发布时间】:2015-11-24 02:31:04
【问题描述】:

我今天遇到了一段代码,促使我编写了这个小函数:

def strangeloop(n):
   for n in range(1, n):
      print n

strangeloop(10) 最终打印了从 1 到 9 的数字。我的问题是,为什么循环变量与参数不冲突?

【问题讨论】:

  • 请注意,重载指的是函数,而不是变量。变量被覆盖。 :)

标签: python loops variables


【解决方案1】:

for 循环将值分配给其循环变量,就像任何其他分配一样。您可以出于同样的原因编写代码:

x = 2
x = 3

后面的赋值只会覆盖前面的赋值。在您的情况下,循环变量会覆盖函数参数。

请注意,range(1, n) 在循环开始之前被评估一次。所以当时它指的是函数参数。一旦发生这种情况,第一个循环值被分配给n,然后函数参数被覆盖并且不再可访问。循环一旦循环就不再“需要”函数参数。

【讨论】:

    【解决方案2】:

    答案是range(1, n)创建了一个范围对象,当for循环将n设置为范围内的值时,函数参数n被覆盖并不重要。

    这段代码运行良好可能并不令人惊讶,而且它的运行原因相同:

    def strangeloop(n):
       r = range(1, n):
       for n in r:
          print n
    

    n 的值是传入范围的值,而不是变量本身,因此范围对象看不到变量n 已更改。

    【讨论】:

      【解决方案3】:

      Pythons for 循环的工作方式与 c for 循环不同。 range 不会将运行变量与其参数进行比较。 它返回数字列表 (python2) 或 yields 这些数字的生成器。

      for 循环随后将一个又一个元素分配给运行变量。

      python2:

      >>> l = range(5)
      >>> l
      [0, 1, 2, 3, 4]
      

      python3:

      >>> g = range(5)
      >>> g
      range(0, 5)
      >>> list(g)
      [0, 1, 2, 3, 4]
      

      【讨论】:

      • 我怀疑有这样的东西,但我不知道如何清楚地表达它来搜索它。谢谢。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-21
      • 2011-05-13
      • 1970-01-01
      • 2020-10-18
      • 2019-12-27
      相关资源
      最近更新 更多