在以下 Python 3.8.0.0 脚本中,不允许从子/嵌套函数的封闭函数范围更改不可变变量,但是,在不使用子/嵌套函数的非本地声明的情况下修改可变类型元素工作得很好。有人可以解释一下,为什么会这样?
def func():
func_var1 = 18
func_var2 = 'Python'
func_var3 = {1,2,3,4,5,6}
func_var4 = [1,2,3,4,5,6]
func_var5 = {'P': 'Python', 'J': 'Java'}
def sub_func():
nonlocal func_var1
func_var1 = 20
print(func_var1)
nonlocal func_var2
func_var2 = 'Java'
# For mutable types, why does it allow to update variable from enclosing function scope without nonlocal declaration?
func_var3.add(7)
print(func_var3)
func_var4.append(7)
print(func_var4)
func_var5.update({'G':'Go'})
func_var5['R'] = 'Ruby'
print(func_var5)
sub_func()
func()
输出
20
{1, 2, 3, 4, 5, 6, 7}
[1, 2, 3, 4, 5, 6, 7]
{'P': 'Python', 'J': 'Java', 'G': 'Go', 'R': 'Ruby'}