自由变量(free variable),未在局部作用域中绑定的变量。
>>> b = 6
>>> def f1(a):
... print(a)
... print(b)
...
>>> f1(3)
3
6
>>> b = 6
def f1(a):
... print(a)
... print(b)
... b = 9
...
>>> f1(3)
3
Traceback (most recent call last):
File "<input>", line 1, in <module>
File "<input>", line 3, in f1
UnboundLocalError: local variable 'b' referenced before assignment
b = 9
报错:局部变量b在赋值前进行了引用。>>> b = 6
>>> def f1(a):
... global b
... print(a)
... print(b)
... b = 9
...
>>> f1(3)
3
6
class Averager():
def __init__(self):
self.series = []
def __call__(self, new_value):
self.series.append(new_value)
total = sum(self.series)
return totle / len(self.series)
avg = Averager()
avg(10) # 10.0
avg(11) # 10.5
avg(12) # 11.0
def make_averager():
series = []
def averager(new_value):
# series是自由变量
series.append(new_value)
total = sum(series)
return totle / len(series)
return averager
avg = make_averager()
avg(10) # 10.0
avg(11) # 10.5
avg(12) # 11.0
def make_averager():
count = 0
total = 0
def averager(new_value):
count += 1
total += new_value
return total / count
return averager
def make_averager():
count = 0
total = 0
def averager(new_value):
nonlocal count, total
count += 1
total += new_value
return total / count
return averager
def make_averager():
# 可变类型
count = {}
def averager(new_value):
print(count) # 成功
count[new_value] = new_value
return count
return averager
def make_averager():
# 不可变类型
count = 1
def averager(new_value):
print(count) # 报错
count = new_value
return count
return averager
def make_averager():
# None
count = None
def averager(new_value):
print(count) # 报错
count = new_value
return count
return averager
参考资料: 《流畅的Python》
联系客服