PYTHON学习0024:函数---局部变量和全局变量----2019-6-19

1、在函数里面(函数的作用域)定义的变量就叫局部变量。在函数外面的变量就叫全局变量,全局能用。

2、函数里面可以调用全局变量,但函数外面不可调用局部变量。也就是说局部变量的作用域只限于函数内部。

3、如果全局和局部都有一个相同名字的变量,函数查找变量的顺序是由内而外的。

4、如果一个程序里有多个函数内部定义了相同的变量名,则变量名之间互不影响的,因为是同级别的。

5、在函数内部修改全局变量:
先声明为全局变量:global后加上变量名

然后给全局变量重新赋值。(注意:必须先用global声明,而后再赋值,且函数内部的global前不能给变量赋值)
如下:
name="Black Girl"
def translate():
global name
name = "黑姑娘"
print(name,id(name))

translate()
print(name,id(name))
输出结果为:
黑姑娘 31330096
黑姑娘 31330096

可以看到2个name的结果和内存地址都一样。

6、当变量为列表时:
①、当变量为列表时,函数内外都有同样的变量名时,在函数内部给变量重新赋值时,局部变量不影响全局变量,如下:
name=[1,2,3]
def translate():
name = ["a","b"]
print(name,id(name))

translate()
print(name,id(name))
输出结果为:
[‘a‘, ‘b‘] 5006024
[1, 2, 3] 5005960
②、但是如果在函数内部,对列表进行增删查改操作时,全局变量里的值同时会被修改。还是内存地址的问题。
函数内部重新赋值时,相当于新建了一块内存地址,只不过变量名和全局变量一样而已。
但是在函数内部对变量进行增删改查操作时,只是改变变量内部某一元素的值进而改变这个元素的内存地址,但是不改变这个变量的地址,所以这个时候全局变量里元素的值也同样被改变,如下:
name=[1,2,3]
def translate():
name.append("pw")
print(name,id(name))

translate()
print(name,id(name))
输出结果为:
[1, 2, 3, ‘pw‘] 34103944
[1, 2, 3, ‘pw‘] 34103944
可以看到变量name的值和内存地址完全一样。
如果要改变这个类型为列表的变量的内存地址的话,还是要用global声明为全局变量,然后重新赋值。

字典,列表,集合,类、对象 可以通过这种方式在函数内部修改里面的元素,同时使得函数外面的全部变量里的元素也跟着被修改。
字符串,数字不能以这种方式修改。
元祖里面如果有字典,列表,集合,也可以修改。

原文地址:https://blog.51cto.com/13543767/2410911

时间: 2024-10-11 00:48:43

PYTHON学习0024:函数---局部变量和全局变量----2019-6-19的相关文章

python学习-day15:局部变量与全局变量、嵌套函数、递归

一.全局变量与局部变量 在子程序中定义的变量称为局部变量, 在程序的一开始定义的变量称为全局变量. 全局变量作用域是整个程序,局部变量作用域是定义该变量的子程序.当全局变量与局部变量同名时:在定义局部变量的子程序内,局部变量起作用:在其它地方全局变量起作用. 通过在函数内部,先添加一个 global  name    相当于在子模块定义了一个全局变量.把局部的name扩到到全局变脸,后续name的变化,也是全局的! name='lhf' def change_name(): #global na

PYTHON 函数局部变量和全局变量

有这样一段PYTHON代码,从事C语言开发的人都知道,如果定义了全局变量,而函数内没有定义同名的函数变量的话,那么在函数内对该变量的赋值就是对全局变量空间数值的修改, 然后在PYTHON中却不尽相同,在python中的函数中,如果没有明确声明是全局变量,那么python就会为函数创建局部变量,所以函数中操作的变量也是局部变量 count = 5 def myfun(): count = 10 print(count) myfun() print(count) 打印的结果如下 那么如何在函数中修改

python 学习笔记 函数和类

与java类似 python的函数也是出于可以复用才使用的 如果一段代码没有复用的价值就可以不用函数 一般的函数可以定义成这样: def func(a,b=123,*arg,**args): for x in arg:#arg是一个list print x for x,y in args.items():#args是一个dict print x,y print 'a:',a print 'b:',b func(1,1,2,3,4,c=1,d=2) 结果: 2 3 4 c 1 d 2 a: 1 b

Python学习之函数篇

python查看对象,函数帮助文档:.__doc__,例:str.split.__doc__ 查看详细对象,函数文档:help(),例:help(str.split) 函数参数可设置默认值 如果不能提前确定参数个数,可以采用可变参数,因此,python不必支持函数的重载,更简单,更方便的实现重载 函数示例: 求最大公约数.最小公倍数函数封装 原文地址:https://www.cnblogs.com/baobao2201128470/p/10884153.html

python学习笔记 - 函数,集合,包,模块

一.函数 a=1, b=2, 交换值 定义中间量c,C=None, a,b=b,a a,b,c=1,2,3 sys.argv 实现指定的某些功能,使用的时候可以直接调用,简化代码,提高代码复用性 def fun():#定义一个函数,后面是函数名                print("Hello World")#函数体 例如: 1.def sayHello(): print("Hello World") sayHello()  --调用 2.def sayNam

python 学习之函数

1.内置函数 callable() #定义是否能调用 def (f1):    falsef1()print(callable(f1)) #判断f1是否能被调用,可以返回True 否则返回False chr()  用来做ASCII码转换  a=chr(65) print(a) A #65所对应的ascii码ord()  用来做ASCII码转换  b=ord'A') print(b) 66   #A在ASCII码表所对应的数字 import random  #随机生成字母list1 = []  f

python学习总结(函数进阶)

-------------------程序运行原理------------------- 1.模块的内建__name__属性,主模块其值为__main__,导入模块其值为模块名 1.创建时间,py文件比pyc文件新,则从新生成pyc. 2.magic num,做运行前版本测试,版本不同重新生成pyc. 3.PyCodeObject对象,源代码中的字符串,常量值,字节码指令,原始代码行号的对应关系. 2.LEGB规则 1.Local :本地 当前所在命名空间(如函数,模块),函数的参数也属于命名空

Python中通过函数对象创建全局变量

先看下面这段代码,显然无法work. 因为代码试图在TestVariableScope()中引用一个没有被定义的变量a.所以必须报错,如下图-1. 不过如果你将第2行代码注释掉.代码就能跑通了,如图-2. 问题1来了:TestVariableScope.a 不是也没有被定义吗,为什么可以work呢?解释如下:先看代码第8行,TestVariableScope.a在SetVariable方法中被定义了,SetVariable()又 在TestVariableScope()前被调用.所以TestVa

【python】-递归,局部变量与全局变量

1.必须有一个明确的结束条件. 2.每次进入更深一层递归时,问题规模相比上次递归都应有所减少 3.递归效率不高,递归层次过多时会导致栈溢出 (在计算机中,函数调用是通过栈stack这种数据结构实现的,每当进入一个函数调用, 栈就会加一层栈帧,每当函数返回,站就会减一层栈帧,由于栈的大小不是无限的,所以, 递归调用的次数过多,会导致栈溢出.) 局部变量与全部变量 局部变量的作用域: 全部变量的作用域: 只有全局变量为字符串或数字时 在子程序中不会修改全局变量 当全局变量为其他复杂类型时,若在子程序