在循环内使用局部函数变量

时间:2016-12-28 18:23:34

标签: python loops variables

def loop():
    d = 0
    for x in range(12):
        d+=1 #this 'd' is not the same as the one above.
    print(d)

在上面的代码中,函数的局部变量是否仍为0?如何更改此项以使用函数变量而不是循环的内部变量?

3 个答案:

答案 0 :(得分:2)

我认为你在功能范围之外和范围之内感到困惑。

d = 1
def a():
    d = 0 # this is a different d from line 1
    for x in range(12):
        d += 1 # this is the same d as line 3
    print(d) # same d as line 3
print(d) # same d as line 1

您可能已经阅读了有关本地范围的变量,但却感到困惑。缩进您的行不会创建一个新的本地范围"。发生的唯一时间是在功能内。

答案 1 :(得分:1)

这不是范围在Python中的工作原理。函数中的d可由函数中的循环访问。它们是相同的d

def loop():
    d = 0
    for x in range(12):
        d+=1 #this 'd' IS the same as the one above.
    print(d)

loop()

运行代码证明它是相同的d

<强>输出:

  

12

...您的代码可以满足您的需求。请在运行之前运行您的代码并查看输出。

答案 2 :(得分:1)

一般来说,Python不会改变循环(forwhile)或if构造中的变量范围:

你的函数中只有一个d变量,无论是否在循环中使用它。

但也有例外 - 其中一个是你可以在列表推导或生成器表达式中使用循环 - 这些循环中使用的变量是表达式的本地 - 尽管是表达式,它们不允许一般赋值变量:

def a():
   d = 0
   any(print(d) for d in range(12))
   print("main d:", d)

(此示例使用Python 3打印功能)。

另一个例外是a中的assignet异常的变量 try ... except阻止。该变量是except块的本地变量,并且停止了它的存在 - 但是没有嵌套的作用域,Python确实从当前作用域中删除了变量:

In [34]: def b():
    ...:   a = 1
    ...:   try:
    ...:     1 / 0
    ...:   except ZeroDivisionError as a:
    ...:     print(a)
    ...:   print(a)
    ...:    

In [35]: b()
division by zero
---------------------------------------------------------------------------
UnboundLocalError                         Traceback (most recent call last)
...
----> 7   print(a)
      8