def loop():
d = 0
for x in range(12):
d+=1 #this 'd' is not the same as the one above.
print(d)
在上面的代码中,函数的局部变量是否仍为0?如何更改此项以使用函数变量而不是循环的内部变量?
答案 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不会改变循环(for
,while
)或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