python3基础(六)-变量

1、局部变量

在函数里面定义的变量为局部变量,它只能在该函数当中使用(它的作用范围在该函数里面),出了该函数就不起作用了。如果局部变量和全局变量的名字是一样的,则在函数内会优先使用局部变量。

2、全局变量

在函数体外面定义的变量为全局变量,可以在后面的代码中使用。

3、str(list)函数

names=['zhan', 'tao', 'lishi']
print("names的值为%s"%names)    #前面print使用的变量为基础变量,而这里为什么可以使用数组呢,其实是系统自动帮我们做了些事情,比如在这个地方系统自动调用的函数将数组转换成了字符串str(names)

4、函数多个返回值

def test():
    a=1
    b=2
    return a,b    #函数是可以返回多个值的,也可以返回一个数组类型的值:return [a,b]
x,y=test()    #可以使用两个变量来接它里面返回的两个值。x=1,y=2
x=test()    #也可以使用一个变量来接它里面返回的两个值,只不过返回的值变成了元组(1,2),也可以使用一个值来接它返回的数组。

5、缺省参数值

def test(x, y, z=10):    #z=10则是缺省参数,缺省值为10
print(x, y, z)

什么是缺省参数?函数里面定义的参数,一般调用时是必须要传入值的。而缺省参数,则是参数含有默认值,而调用时不一定要对此参数传值。当调用此函数时,不传值时缺省参数则会使用默认值,当传入值时,缺省参数则会使用新传入的值。

6、不定长参数

def test(x, y, *args):    #*args为匿名参数,也就是不带名字的
    print(x, y)
    print(args)
    sum = x + y
    for i in args:
        sum+=i
    print(sum)
test(1,2,3,4,5,6,7,8)
结果:x=1,y=2,args=(3,4,5,6,7,8)

def test2(x, *args,  **kwargs):    #*kwargs为带名字的参数
    print(x)
    print(args)
    print(kwargs)
    sum = x + y
    for i in args:
        sum+=i
    for i in kwargs.values():    #既然kwargs是字典,而我们所需要的只是字典的值
        sum+=i
    print(sum)
test2(1,2,3, num1=4, num2=5)    #此处如果不指定名字,那么4和5也会被传给匿名参数
结果:x=1,args=(2,3),kwargs={'num1' : '4', 'num2' : '5'}    #从结果可以看出kwargs参数返回的是一个字典

7、集合的拆包

nums=[2,3]
num2={"num1":4, "num2":5}
test2(1, *nums, **nums2)    #打印出来的结果,跟test2(1,2,3, num1=4, num2=5)这种传参方法所得到的结果是一样的。本来nums和num2是全局变量名,但在传入的参数前加上*或**号,是为了表明传入的是匿名参数,还是带名字的参数。

8、小知识

1)如果在全局变量定义了一个age=30。如果在某个函数当中,也使用赋值运算符直接age=30,则是代表在此函数里面重新定义了一个局部变量为age,而不一定是修改全局变量。(这块是跟java不同的,java里面是直接修改全局变量)
2)如果在赋值运算前加上global age,则代表下一行是修改变量值。
3)如果全局变量是可变类型的变量,则可以在调用它的函数里面直接通过变量本身的函数修改变量的值。但是需要重新赋值也就是修改引用,仍然要加global age提前申明,否则仍然是在调用函数里面新建一个新的局部变量。list或dict。
4)如果全局变量是不可变类型是绝对不能修改它的值的。比如连续定义两个全局变量age=100,age=200,这并不是把age的值改成了200,而是在内存当中存在两个堆内存块,一个堆内存块存的值为100,另一个堆内存块存的值为200,只是修改了变量age的引用而已。而如果age=200是在函数当中,那么即不可以修改全局变量age的值,也不能修改全局变量age的引用,而是重新定义了一个新的局部变量age。除非在上一行,加上global age,也仅仅是修改引用而已。
5)函数定义时,缺省参数不能放在默认参数之前定义。意思就是带有默认值的形式参数,必须放在没有默认值的的参数后面定义。
6)函数里面变量的变化,要注意可变变量与不可变变量的区别。比如str.replace("", "")函数是不会导致str本身的值有任何变化的,而是创建一个新的字符串,所以在调用此函数时需要定义一个变量来接它的结果。

作者:沧水巫云
博客:http://blog.csdn.NET/amir_zt/
以上原创,转载请注明出处,谢谢。
https://blog.csdn.net/amir_zt/article/details/83011931

猜你喜欢

转载自blog.csdn.net/u011635351/article/details/83011931