关于python 闭包的一个有关问题(闭包有点难理解)

关于python 闭包的一个问题(闭包有点难理解)
python 核心编程(第二版) 中 ,11.8.4 闭包有个例子

def counter(start_at=0):
count = [start_at]
def incr():
count[0] += 1
return count[0]
return incr

难道其中count[] 一定要是列表吗?改成了count(如下)就不能运行了吗?

def counter(start_at=0):
count = start_at
def incr():
count += 1
return count
return incr

有高手知道这是为什么吗?

------解决方案--------------------
闭包我也看不懂有啥作用,不过总的没啥关系吧,应该说是python的特性吧,当你在incr里count += 这个时候count就成了局部变量,而不是counter里那个,讷么+=之前你要先count=啥的。不过counter是个函数,你又不好用global或者类的.操作符去界定它的count变量,那么用个可变的list似乎就顺里成章,因为只对它的元素操作,那么incr的count还是等同counter里那个。
------解决方案--------------------
在python3.0之前的版本中, 闭包只能够访问而不能修改外部变量(非全局), 所以, 通常为了方便修改, 我们就使用可变对象来通过修改对象内部的一些引用来达到间接修改的目的, 因此, 通常的数字类型, 字符串类型等不可变类型不可以作为用于修改的自由变量(闭包中引用的外部变量)

在python3.0及以后版本中, 通过nonlocal关键字解决了这个问题, 并增强了闭包. 在之前的版本中, 外部变量实际上是会放入内部函数(闭包)的local这个名称空间中的, 所以, 在之前版本中, 我们在闭包内试图修改一个外部变量的时候, 往往会得到一个"在引用之前没有赋值"的一个错误. 3.0之后, 给要在闭包内修改的变量加上(在闭包内修改之前)nonlocal的声明, 然后, 在下面的代码中修改就可以了....

这个用法和global关键字解决函数内修改全局变量有异曲同工之妙...
------解决方案--------------------
在比较这个

count=[1]
def incr():
count[0] += 1
return count[0]


print incr()