【问题探究】Python中函数关于局部变量的一些特性

前言:

{

   使用的Python版本为3.6.2。

    在调试Python程序时,我原本以为Python中和全局变量C中的一样,但发现了一个关于变量的很大的区别:Python中的函数里不能直接使用全局变量,但是函数返回中的函数的参数可以为全局变量。

}

 

正文:

{

    一段时间以前,我写了一个检测文件更新的函数,见代码1,

#代码1
import os
import time

time_stamp = 0

def detector():
    while True:
        now_time_stamp = os.stat('/file/path/name').st_ctime
        if time_stamp != now_time_stamp:
            time_stamp = now_time_stamp
            #这里添加想执行的代码
        time.sleep(3)

detector()
        

    其中os.stat('/file/path/name').st_ctime会返回文件的创建时间[1]。一开始我是看不出有什么问题(不要说“/file/path/name”路径错误,路径需要换成想检查的文件的路径),但是程序报错了,见图1。

图1

    我还一再确认了我没有打错变量的字母。因此当时我认为,Python的函数中只有通过传参方式才能访问全局变量,直接访问则会出现图1中的错误。

    这件事本来就差不多这样过去了,但是由于一个不细心,在写多目标识别项目的时候误把全局变量作为了传参(代码是之前写的,但最近看到之后突然想到了全局变量的问题),可是这段代码运行了很久都没有问题。我把代码1改成了代码2来测试一下。

#代码2
import os
import time

time_stamp = 0

def func(time_stamp):
    now_time_stamp = os.stat('/file/path/name').st_ctime
    if time_stamp != now_time_stamp:
        time_stamp = now_time_stamp
        #这里添加想执行的代码
    time.sleep(3)
    

def detector():
   funt(time_stamp)

detector()

    代码2有问题吗?其实没有(除了路径)。

    虽然得到了结论,但不知道为什么Python需要有这样的设计。我在新买的书[2]上也没看到相关介绍,只说了使用global来引用全局变量,见图2(图中也涉及到了函数对全局列表的操作,具体信息可以在百度搜到)。

图2

}

 

结语:

{

    我还搜到了关于while的变量定义问题[3],在不确定条件的环境下只能定义在此条件环境下的局部变量。

    思考题:运行代码3打印的是什么?会报错吗?(哪里?为什么?)(‘_’用作一次性的名字,‘_’将让下一个阅读您代码的人知道,按照约定,一个变量被指定了名称,但不打算使用[4])

#代码3
a = 0

def func1(a):
    print(a)
    
def func2():
    func1(a)

def func3():
   a = 1
   func1(a)

func3()
func2()
func1(a)
func1(_)

    参考资料:

    {

        [1]https://www.cnblogs.com/maseng/p/3386140.html

        [2]《Python语言程序设计基础(第2版)》嵩天,礼欣,黄天羽 著

        [3]https://stackoverflow.com/questions/39990133/while-loop-unboundlocalerror-local-variable-referenced-before-assignment

        [4]https://blog.csdn.net/yaopliu/article/details/78152593

    }

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值