精华内容
下载资源
问答
  • 此内容来自于沙行勉的《计算机科学导论-以python为舟》函数调用的基本概念:程序语言中的函数与高中数学中的函数相似。高中函数,假设要实现z+x*y²这个计算。对于乘法计算,定义一个函数f(x,y)=x*y²,他有两个参数...

    此内容来自于沙行勉的《计算机科学导论-以python为舟》

    • 函数调用的基本概念:程序语言中的函数与高中数学中的函数相似。高中函数,假设要实现z+x*y²这个计算。对于乘法计算,定义一个函数f(x,y)=x*y²,他有两个参数x和y。计算x²+y²后得到一个值,作为函数的返回值,赋给f(x,y)。这样就可以用z+f(x,y)来表示上面的运算,对于f(x,y)运算,将会调用到已经定义的函数f(x,y)=x*y²。程序语言中的函数也有参数和返回值,以及定义与调用。程序中的函数就是将一些程序语句结合在一起的部件,可以多次的调用。
    • 函数中的变量:

    局部变量:函数中的局部变量只能被这个函数访问,不能被其他函数访问。

    全局变量:在函数之外被赋值的变量。

    a = 10
    def fun():
        a = 20
        print(a)    #函数内a内局部变量
    fun()
    print(a)        #函数外a为全局变量复制代码

    • 局部变量的判断:
    1. 不出现在global语句中 (global语句为申明某个变量为局部变量)
    2. 出现在函数参数中
    3. 出现在函数参数语句中的等号左边

    • python函数调用:

    python进行函数调用时,参数的传递都是通过赋值的方式。

    def func(L1):       #定义一个func()函数,参数为L1
        L1.append(1)    #对L1采用.append()方法,结果为[2,1],并且改变全局变量L的值(因为L1和L都指向同一个heap)
    L = [2]             
    func(L)             #func()函数运行,参数为L,进行赋值传递给func()函数中的局部变量L,
    print(L)            func()函数执行完后,局部变量L1指向全局上的值[2,1],L也指向这个全局上的值[2,1](L1与L指向同一块内存区域)复制代码

    其中列表做参数时,传递的是指针,函数中的参数指向的内容为全局变量区域,成为heap。

    stack-栈,heap-堆

    注意事项:

    1. 列表的append、pop、remove等方法,以及给L[i]赋值,对L[i]使用增强赋值等,都会修改列表L所指向的内容,进而对全局产生影响。
    2. 列表的一般合并,或者使用列表的分片(即L[i:j]这种形式)都不会对全局的列表L产生影响。合并与分片的操作会产生新的列表,赋值到一块新的内存区域(heap)上。

    • return(L)返回L的指针:

    def F1():
        L = [3,2,1,]    #L是局部变量,而[3,2,1]是在栈的外面heap上。
        return(L)
    L = f1() 
    print("L=",L)复制代码

    全局变量L调用f1()函数,f1()函数中的局部变量L经return返回到函数外的全局变量L,此时局部变量L和全局变量L都指向同一个heap。

    • L做函数参数传递:

    def F2():                  #参数L是个指针,是存放在栈上的局部变量
        L = [2,1]              #此语句将函数L又赋值为[2,1]
        return(L)              #return(L)将局部变量L的值赋值给了主调函数的全局变量(例如L = F2(),L是主调函数,F2()则是被调函数)
    def F3():               
        L.append(1)            #L指向的是原来的全局内容,会改变全局L
        L[0] = 0
    L = [3,2,1]               
    L = F2(L);print("L=",L)   
    F3(L);print("L=",L)         #调用F3(L)后,L的全局已经被改变复制代码

    • 好的编程习惯:
    1. 尽量避免在函数中使用全局变量
    2. 若在函数中需要使用外部的变量,使用参数传递。
    3. 对函数调用中mutable变量(列表、字典等)



    转载于:https://juejin.im/post/5bd58d266fb9a05cf03a305c

    展开全文
  • 函数如何调用全局变量,这里主要介绍关键字global与nonlocal; 1,首先,我们介绍global关键字 先看下面的例子: a=10 def fun(): value=a+1 print("a=%d,vlaue=%d" % (a, value)) fun() 运行结果为: a=10,...

    函数如何调用全局变量,这里主要介绍关键字global与nonlocal;

    1,首先,我们介绍global关键字
    先看下面的例子:

    a=10
    def fun():
    	value=a+1
    	print("a=%d,vlaue=%d" % (a, value))
    fun()
    

    运行结果为:

    a=10,value=11
    

    这里的a是定义在主流程中的,称为全局变量
    value是定义在函数中的,称为局部变量
    全局变量在所有的代码块中,都能访问,在函数中也可以访问。
    所以,add()函数中的可以访问全局变量a。

    但是,当我们尝试着 去将a的值改变之后再赋值给其本身,例如:

    a=10
    def fun():
    	a=a+1
    	print("a=%d" %a)
    fun()
    

    此时运行结果便报错了:

    
    UnboundLocalError: local variable 'a' referenced before assignment
    
    

    因为:当尝试去修改全局变量的值,会使用了赋值语句(a=a+1),此时的赋值语句左边的变量a会被看成是函数栈上的变量,就是局部变量。
    赋值语句右边的变量a会根据就近原则去选择,由于a在赋值语句中左边出现了,所以就认为这个a就是局部变量,但是此时a还没有完成赋值。所以程序就会认为a在赋值前就被访问了,所以报错: referenced before assignment

    所以,global关键字就在此刻登场了

    如果我们想在函数内部修改全局变量的值,就需要在修改之前用global声明一下该变量为全局变量,例如:

    a=10
    def fun():
    	global a
    	a=a+1
    	print("a=%d" %a)
    add()
    

    运行结果:

    a=11
    

    但是在特殊情况下,如果全局变量为可变类型的话,可以不需要用global进行声明。

    a = [10]
    def fun():
        a[0] = a[0] + 3
        print("a=%d" % (a[0]))
    fun() 
    
    

    运行结果:

    a=13
    

    2,nonlocal关键字
    python中,可以在一个函数中定义另一个函数(嵌套)

    a = 8  # 全局变量
    def outer():
        '''外部函数'''
        b = 10  # 外部函数的全局变量
        def ininer():
            '''内部函数'''
            nonlocal  b
            b = b + 1
        ininer()
        print('b=%d' % b)
    outer()
    

    运行结果:

    b=11
    

    通过代码可知,nonlocal关键字是在内部函数中使用,用于调用外部函数定义的变量。

    展开全文
  • python函数里引用全局变量

    千次阅读 2019-08-05 14:47:18
    python在引用变量的时候尤其要注意变量的作用域,在函数里引用不可变类型变量的时候,函数执行结束后是不会改变全局变量的值的;若想在函数里改变不可变类型全局变量的值时,引用的时候要用”global arg";对于可变...

    python在引用变量的时候尤其要注意变量的作用域,在函数里引用不可变类型变量的时候,函数执行结束后是不会改变全局变量的值的;若想在函数里改变不可变类型全局变量的值时,引用的时候要用”global arg";对于可变变量,函数执行结束后全局变量的值是回被改变的,如下:(说明一下,python不可变数据类型:string,int ,tuple 常量;可变数据类型:dict list)

    1. 在函数里引用不可变类型的全局变量:
      在这里插入图片描述
      可见,func1执行完后全局变量arg的值仍是1;
      在函数内部改变全局变量的值则要在引用的时候说明"global":
      在这里插入图片描述
    2. 在函数里引用可变类型的全局变量:
      在这里插入图片描述
      可见,list[0]的值由1被改为9,引用的时候不用加"global"
    展开全文
  • delete.py文件(被调用的文件) def app_lost(x): print('%s : Hello !'%x) print(3) a='Matting' app_lost(a) print(4) sky.py文件(记得不要用4.py这样的数字作为被调用的文件否则无法调用,执行文件...

    在同一个文件夹下

    调用一个函数
    delete.py文件(被调用的文件,(记得不要用4.py这样的数字作为被调用的文件否则无法调用,执行文件可以,例如下面的sky.py可以改为4.py))

    def add(x,y):
        print('和为:%d'%(x+y))
    

    sky.py文件

    import delete
    delete.add(1,2)
    

    或者

    from delete import add
    add(1,2)
    

    调用一个类

    delete.py文件(被调用的文件)

    class A:
        def __init__(self,xx,yy):
            self.x=xx
            self.y=yy
        def add(self):
            print("x和y的和为:%d"%(self.x+self.y))
    

    sky.py文件

    from delete import A
    a=A(2,3)
    a.add()
    

    或者

    import delete
    a=delete.A(2,3)    # 这个也是一个传参的手段
    a.add()
    

    在不同文件夹下

    delete.py文件的文件路径:E:\PythonProject\winycg

    import sys
    sys.path.append(r'E:\PythonProject\winycg')
    '''python import模块时, 是在sys.path里按顺序查找的。
    sys.path是一个列表,里面以字符串的形式存储了许多路径。
    使用A.py文件中的函数需要先将他的文件路径放到sys.path中'''
    import A
     
    a=delete.A(2,3)
    a.add()
    

    其他补充:

    delete.py文件(被调用的文件)

    def app_lost(x):
        print('%s : Hello !'%x)
        print(3)
    a='Matting'
    app_lost(a)
    print(4)
    

    sky.py文件

    from delete import app_lost
    k='Karry'
    print(1)
    if __name__ == "__main__":
        app_lost(k)
        print(2)
    

    执行结果为
    Matting : Hello !
    3
    4
    1
    Karry : Hello !
    3
    2
    如果不想执行delete的其他东西,只想用它的函数那么就要封装

    def app_lost(x):
        print('%s : Hello !'%x)
        print(3)
    a='Matting'
    if __name__ == "__main__":   # 封装,只有自己执行这个文件才会执行下面的语句
        app_lost(a)
        print(4)
    

    参考:https://blog.csdn.net/winycg/article/details/78512300
    背景pyqt
    1.对于类中函数要用一个变量来做判断(用self.函数)

    class MyWindow(QMainWindow, Ui_MainWindow):     
        def __init__(self, parent=None):    
            super(MyWindow, self).__init__(parent)  
            self.setupUi(self)                      
            self.retranslateUi(self)     
            self.last_result = -1  # 一个判断机制变量     
        def press_picture(self):  # qt里面一个按钮触发press_picture槽函数,(python里面只会执行放在一个行的语句,这里有个tab空格所以不会执行得到
        	if last_max != self.last_result:
        		print(self.last_result)
    

    2.函数之间调用变量(还是加global)

     class MyWindow(QMainWindow, Ui_MainWindow):     
            def __init__(self, parent=None):    
                super(MyWindow, self).__init__(parent)  
                self.setupUi(self)                      
                self.retranslateUi(self)       
            def press_picture(self):  
            	global k  # 让k变为全局变量
    			k=3
    		def fly(self):# 也是一个槽函数
    			y=k+1
    			print(y) k=4
    

    3.变量在类外面也是一样加global

     pic_name_num = 1 
     class MyWindow(QMainWindow, Ui_MainWindow):     
            def __init__(self, parent=None):    
                super(MyWindow, self).__init__(parent)  
                self.setupUi(self)                      
                self.retranslateUi(self)       
            def press_picture(self):  
            	global pic_name_num   # 反正哪里用到了都要加global
            	global model
    			if (pic_name_num == 1):
    				model =XXXXXXX
    

    4.pyqt里面的调用函数(只是举例子看看就好)

    class MyWindow(QMainWindow, Ui_MainWindow): 
    	       def ShowCameraOneImage(self):
    	    		self.keyPressEvent()   # 加了self才可以调用其他函数
    	       def keyPressEvent(self,event):
    		        if (event.key() == Qt.Key_A):
    		            print('hello,‘a’')
    		        else: print(777)
    

    5.如果一个文件调用另一个问价变量有两种方式
    1.aaa.py里面

    uuu=6
    class MyWindow(QMainWindow, Ui_MainWindow): 
    print(uuu) #6
    

    bbb.py里面

    class Ui_Dialog5(QtWidgets.QWidget,Ui_Form):  
    	def __init__(self):
    		from aaa import uuu # 这样调用其实是一个副本,也就是局域变量,这里改变不会影响aaa.py里面的值
    		uuu = uuu+4
    		print(uuu)  # 10
    

    2.用pickle(directory1就是变量)

    class Ui_Dialog3(QtWidgets.QWidget,Ui_Form):  
        def __init__(self):
            super(Ui_Dialog3,self).__init__()
            self.setupUi(self)                   
            self.setWindowTitle("训练窗口")
            self.retranslateUi(self)           
            self.setWindowIcon(QIcon('logo.png'))
    
            if not os.path.exists('/home/test3_1.txt'):
                os.mknod('/home/test3_1.txt')
            f = open('/home/test3_1.txt', 'rb')
            if os.path.getsize('/home/test3_1.txt'):
                d = pickle.load(f)
                self.lineEdit.setText("%s" % (d))
            f.close()
    
        def browse(self):
            # global directory1 
            global k 
            global directory1
            directory1 = QFileDialog.getExistingDirectory(self, "选取文件夹", "C:/")  # 起始路径
            self.lineEdit.setText("%s" % (directory1))
    
            c = directory1
            f = open('/home/test3_1.txt', 'wb')
            pickle.dump(c, f)
            f.close()
    

    关于import X 还有from x import * 这个问题
    import 模块:导入一个模块;注:相当于导入的是一个文件夹,是个相对路径。
    from…import:导入了一个模块中的一个函数;注:相当于导入的是一个文件夹中的文件,是个绝对路径。
    不推荐使用from x import * 因为怕和原来文件下有一样的名字就会名字冲突,而且这句话意思是把这个文件里面的东西全部导入,所有函数还有变量。

    明天再来多进程多线程

    展开全文
  • a = [1,2] c = {'q':1} d = 5 e = 'qw' ... global d #数字 字符串 元祖 修改全局变量时需要加global,列表和字典则不需要。 global e global f a[1] = 1 a.append(7) c['b'] = 2 d = d + 1 ...
  • common_words = obama_words.sort('count', ...上述代码中,函数has_top_words需要用到count这个全局变量,定义在函数之外,函数中使用前,需要在count前加 global 。   代码运行后如下:      
  • 函数局部变量 全局变量 及其作用域 #简单类型(int str等)变量的局部变量与全局变量及其作用域的关系 name = xxx #第一级顶头定义的变量都称为全局变量,其作用域从变量定义的位置开始到此程序结束 def Print_Name...
  • 局部变量 什么是局部变量 通俗定义:函数内部定义的变量就叫局部变量。 话不多说,代码如下: def test1(): a = 300 # 定义一个局部变量a,并初始化...# 分别调用函数test1,test2 test1() test2() 输出: –test1–修
  • 如:全局变量函数,类。如下,test1.py和main.py test1.py __all__=["test"] def test(): print('----test-----') def test1(): print('----test1----') main.py from test1 import * def main(): test() #...
  • 如果在函数中出现global 全局变量的名字那么这个函数中即使出现和全局变量名相同的变量名 = 数据也理解为对全局变量进行修改,而不是定义局部变量,gloal a,b return return除了能够将数据返回之外,还有一个隐藏...
  • python中,对于全局数字变量、字符串变量、列表变量,函数内部只能调用,却无法改变其值;但是,对于字典变量,函数内部是可以改变全局字典变量的值的! 函数内部对全局变量的修改情况 验证方案 # 全局变量 x = ...
  • # 函数调用了这些赋值的参数 并不会改变参数的数据 # 相当于指针 指向数据的位置 C:\Users\Administrator>C:\Users\Administrator\Desktop\100501.py 88 888 10 20 C:\Users\Administrator> ..
  • python函数使用全局变量

    万次阅读 2018-09-19 16:03:44
    python在使用全局变量时需要在函数内部先对变量加一个global s = 0 def test(): global s s +=2 print(s) if __name__ == "__main__": test()  
  • 全局变量: 变量的范围是全局的,声明在函数的外层,所有函数都可以访问,需要修改赋值时要加上加上global。 全局变量是不可变时在函数中进行修改需要添加global; 如果是可变的时,在函数中进行修改时不需要加...
  • 如何在函数中创建或使用全局变量? 如果在一个函数中创建全局变量,如何在另一个函数中使用该全局变量?我是否需要将全局变量存储在需要对其进行访问的函数的局部变量中? 解决方案: 您可以在其他函数中使用全局...
  • 函数内部的变量看成函数的一个属性,从而在其他函数中进行调用,需要注意的是,不管在哪里调用,自己本身函数内部使用或者其他函数调用都需要进行域指定。def fuc1(): #通过一个 ".",使用了fuc2的变量 b = fuc...
  • 请看问题代码 提出问题: 本意就该是 先使用全局变量a...否则看变量是否是外层函数的闭包变量,再看它是否只全局变量,最后看它是否是内建名字空间里的变量 (3) a += 1 是一个典型的赋值语句,因此 a 一定是局部变
  • 一、函数内部调用全局变量 a="hello" #全局变量a def test(): global a#调用全局变量a b =a #test方法里之后再调用a时,都是全局的a print(b,a) test() 在test函数调用全局变量a,看看运行后的结果 (‘hello...
  • 如果没有在函数内部global修饰,那么会在函数内部定义一个同名局部变量并隐藏掉同名全局变量。 二、多线程、跨模块的全局变量全局变量定义一个“全局变量管理模块”,下面主要创建了4个文件 # main.py import ...
  • 前言 Python中,全局变量与局部变量的使用往往令...本节将说明Python函数中修改全局变量,何时需要使用global进行申明 示例1:对全局变量进行赋值操作 num = 0 # num的初始值为0 def test1(): print(num) # 证...
  • 全局变量和局部变量的区别在于作用域的不同,全局变量在整个文件里都是可以访问的,而局部变量只能在某个函数调用。 代码1: a = None def f1(): global a a = 20 b = a + 100 return b print('Pass_a: ', a...
  • # 这是一个全局变量 # 可写函数说明 def sum(arg1, arg2): # 返回2个参数的和." # total = arg1 + arg2; # total在这里是局部变量. # print "函数内是局部变量 : ", total # return total; # ...
  • 我们在下面的代码总中定义了一个edit全局变量,如果想要在一个函数的内部去修改这个全局变量,就要在这个变量前面加上global关键字 #代码如下: edit='数据结构-人工智能' def editGlobal(): global edit edit = '...
  • 由于调用的包装的函数内部需要几个能够不断调用并且保存值的变量,同时这个线程又是不断在for循环内部进行的。 thread = threading.Thread(target=sava_img,args=(im0,compare_thresh,total_frame,vid_path)) th...
  • Python函数是否能使用全局变量

    千次阅读 多人点赞 2019-07-06 22:31:18
    Python函数中的变量,既可以使用局部变量(本地名字空间的变量),也可以使用全局变量(全局名字空间的变量),函数在执行查找变量只读时,先在局部变量中查找,找不到再查到全局变量中查找。因此当局部变量和全局...
  • Python 函数def 模块调用函数方法及全局变量

    千次阅读 多人点赞 2020-04-05 12:14:57
    函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段。 函数能提高应用的模块性,和代码的...你已经知道Python提供了许多内建函数,比如print()。但你也可以自己创建函数,这被叫做用户自定义函数
  • 内置函数:可以直接调用函数 第三方,模块相关函数:即导入第三方包,直接调用第三方包函数 自定义函数:即根据自己的计算需求,编写属于自己的程序段 常用内置函数 (1)len() :计算字符串的长度 如` a =list...
  • Python是一种面向对象的开发语言,在函数中使用全局变量,一般应作全局变量说明,只有在函数内经过说明的全局变量才能使用,这里就来介绍下Python全局变量有关问题。 首先应该说明的是需要尽量避免使用Python全局...
  • A import B,那么A运行的时候,B就会运行。 如果B中需要传入参数,在调用A的时候,需要一起将B的参数传入。 如: ...python A.pyb_input1b_input2 a_input1a_input2, b的参数应该写在前面。 ...
  • Python global全局变量函数详解

    千次阅读 2020-02-11 21:59:32
    在编写程序的时候,如果想为一个在函数外的变量重新赋值,并且这个变量会作用于许多函数中时,就需要告诉python这个变量的作用域是全局变量。此时用global语句就可以变成这个任务,也就是说没有用global语句的情况下...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 86,865
精华内容 34,746
关键字:

python函数调用全局变量

python 订阅