-->

问个python基础问题,为什么时间不更新 及 name 'ss' is not

2021-02-20 10:28发布

问题:

 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  会更新输出的时间。为什么其它函数会不更新呢?

回答1:

我也是个菜鸟,发表一下自己的看法,还请大牛指点。
第一个问题:变量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())不就行了嘛。之所以使用变量是因为它可以将值保存下来,方便后面的其它方法使用,如果你想改变它的值就需要重新给它赋值。



回答2:

问题1 , 你定义的ss不是全局变量,所以用global会找不到;
问题2,因为调用a(),d()函数只是打印了ss的值,并没有重新赋值,ss = time.strftime('%H:%M', time.localtime())这条语句只执行了一次。



标签: python