1 t = time.strftime('%H:%M', time.localtime()) 2 class ee: 3 ss = time.strftime('%H:%M', time.localtime()) 4 def a(self): 5 print(t,'a() t') 6 def b(self): 7 print(ee.ss,'b() ee.ss') 8 def c(self): 9 global ss 10 print(ss,'c() global ss') 11 def d(self): 12 print(time.strftime('%H:%M', time.localtime()),'d()') 13 14 if __name__ == '__main__': 15 z = ee() 16 while 1: 17 z.a() 18 z.b() 19 z.c() 20 z.d() 21 time.sleep(2)
先看代码,很简单。
问题1:
函数a b d 能正常的。但c 就会提示name 'ss' is not defind
c里不是写了global ss吗,为什么 ss 还是未定义呢?
问题2:
运行这段代码后会发现除了 函数d外 ,其它函数输出的时间只是程序运行时的那个时间,不会改变。
只有函数d 会更新输出的时间。为什么其它函数会不更新呢?
我也是个菜鸟,发表一下自己的看法,还请大牛指点。
第一个问题:变量ss的命名空间在你类的内部,他不是全局变量,属于这个类的局部变量,你使用global ss 这条语句有两层含义。1、如果外部有ss这个全局变量,你可以在方法内修改这个全局变量ss。2、如果外部没有ss这个全局变量,会创建一个全局变量,创建变量后你得给它赋值,要不然不能使用。你的这个问题就属于第二种。
第二个问题:方法a打印的是全局变量t,而全局变量t是在程序加载时被赋值的,之后你的while循环方法a中没有给t重新赋值,所以会一直打印一个值,就是程序启动的那个时间。方法b同理,只不过方法b是打印的类的属性也就是变量ss,变量ss的值在第一次调用被赋值后,没有被重新赋值,所以它的值不会变。方法d打印的值之所以会变是因为它一直打印的是当前时间。
你可能误以为每调用一次变量t或者ss就会调用一次time.strftime('%H:%M', time.localtime()),这种想法是不对的,如果是这样的话,那我还用变量干嘛直接用time.strftime('%H:%M', time.localtime())不就行了嘛。之所以使用变量是因为它可以将值保存下来,方便后面的其它方法使用,如果你想改变它的值就需要重新给它赋值。
问题1 , 你定义的ss不是全局变量,所以用global会找不到;
问题2,因为调用a(),d()函数只是打印了ss的值,并没有重新赋值,ss = time.strftime('%H:%M', time.localtime())这条语句只执行了一次。