1、Python中关键字global与nonlocal的区别:
第一,两者的功能不同。global关键字修饰变量后标识该变量是全局变量,对该变量进行修改就是修改全局变量,而nonlocal关键字修饰变量后标识该变量是上一级函数中的局部变量,如果上一级函数中不存在该局部变量,nonlocal位置会发生错误(最上层的函数使用nonlocal修饰变量必定会报错)。
第二,两者使用的范围不同。global关键字可以用在任何地方,包括最上层函数中和嵌套函数中,即使之前未定义该变量,global修饰后也可以直接使用,而nonlocal关键字只能用于嵌套函数中,并且外层函数中定义了相应的局部变量,否则会发生错误(见第一)。
2、类和实例变量
一般来说,实例变量用于对每一个实例都是唯一的数据,类变量用于类的所有实例共享的属性和方法。
如下代码结果有区别:
(1)错误用法
- class Dog:
-
- tricks = [] # mistaken use of a class variable
-
- def __init__(self, name):
- self.name = name
-
- def add_trick(self, trick):
- self.tricks.append(trick)
-
- d = Dog('Fido')
- e = Dog('Buddy')
- d.add_trick('roll over')
- e.add_trick('play dead')
- print(d.tricks)
输出:['roll over', 'play dead']。
tricks是类变量,d和e修改的是Dog的类变量
(2)正确用法:
- class Dog:
-
- def __init__(self, name):
- self.name = name
- self.tricks = [] # creates a new empty list for each dog
-
- def add_trick(self, trick):
- self.tricks.append(trick)
-
- d = Dog('Fido')
- e = Dog('Buddy')
- d.add_trick('roll over')
- e.add_trick('play dead')
- print(d.tricks)
- print(e.tricks)
输出:
['roll over']
['play dead']