Python入门第21课——作用域(只读课堂)

    科技2022-07-16  114

    In [1]: #欢迎来到“只读课堂”!

       ...: #今天要给大家讲的是“作用域”。

       ...: """作用域"""

       ...: #a = 1

    Out[1]: '作用域'

     

    In [2]: #def add(y,z):

       ...: # print y+z+a

       ...: # return

       ...: #全局变量名: a add

       ...: #因为这个a是在这个文件内最外层注册的变量名,所以它是全局变量;它能够在函数内部进行引用,而不需要特定的声明。

       ...: #全局变量的生命周期在这个程序运行期间

       ...:

       ...:

       ...: #本地变量名: y,z

       ...: #y海尔z的注册地址在函数内部,y和z是局部变量

       ...: #局部变量生命周期在函数运行期间。

       ...:

     

    In [3]: #什么是全局?

     

    In [4]: a = 1

     

    In [5]: b = 2

     

    In [6]: #全局

     

    In [6]:

     

    In [7]: def func():

       ...: a = 1

       ...: b = 2

       ...: #局部

       ...:

     

    In [8]: #生命周期

     

    In [9]: #代表我们什么时候可以使用它

     

    In [10]: func()

     

    In [11]: #当我们函数执行完的时候,它的生命周期就结束了。

     

    In [12]: def func():

        ...: c = 3

        ...:

     

    In [13]: func()

     

    In [14]: print(c)

    ---------------------------------------------------------------------------

    NameError Traceback (most recent call last)

    <ipython-input-14-5315f3e3adca> in <module>()

    ----> 1 print(c)

     

    NameError: name 'c' is not defined

     

    In [15]: #它的意思就是说,没有定义这个函数,也就是说这个函数已经死掉了。

     

    In [16]: #而a,b就可以全局使用。

     

    In [17]: #——————————————————————————————————————————————————————————————————————

     

    In [18]: a = 1

     

    In [19]: def func():

        ...: a = 2

        ...: print(a)

        ...: func()

        ...: print(a)

        ...:

    2

    1

     

    In [20]: #此时它就会出现后面定义的结果,再显示之前的。

     

    In [21]: #2是局部变量,1是全局变量,它们就是两个完全不同的变量。

     

    In [22]: def func():

        ...: global a

        ...: a = 2

        ...: print(a)

        ...: func()

        ...: print(a)

        ...:

    2

    2

     

    In [23]: #用 global 就可以把两个都修改了。

     

    In [24]: #——————————————————————————————————————————————————————————————————————

     

    In [25]: mylist = [1,2,3]

        ...: def func(var):

        ...: var[0] = 'a'

        ...: print(var)

        ...: func(mylist)

        ...:

    ['a', 2, 3]

     

    In [26]: print(mylist)

    ['a', 2, 3]

     

    In [27]: #传变量的时候,用这种赋值方式是会改成一样的,它们是同步的。

     

    In [28]: #这个方式叫“函引用”。

     

    In [29]: #为了解决这个问题,我们用以下代码:

     

    In [30]: mylist = [1,2,3]

     

    In [31]: def func():

        ...: #var = mylist

        ...: var = var[:]

        ...: var1[0] = 'a'

        ...: print(var1)

        ...: func(mylist)

        ...: print(mylist)

        ...:

    ---------------------------------------------------------------------------

    TypeError Traceback (most recent call last)

    <ipython-input-31-11ee2baf84f1> in <module>()

    4 var1[0] = 'a'

    5 print(var1)

    ----> 6 func(mylist)

    7 print(mylist)

    8

     

    TypeError: func() takes 0 positional arguments but 1 was given

     

    In [32]: #哦,我们在这里没有清除之前的定义,那么我们换一个变量名。

     

    In [33]: yourlist = [1,2,3]

     

    In [34]: def func(var2):

        ...: var3 = var2[:]

        ...: var3[0] = 'a'

        ...: print(var3)

        ...: func(yourlist)

        ...:

    ['a', 2, 3]

     

    In [35]: print(yourlist)

    [1, 2, 3]

     

    In [36]: #这样就避免了冲突,是不是一个非常好的方法呢?

     

    In [37]: #——————————————————————————————————————————————————————————————————————

     

    In [38]: print("\n本次“只读课堂”的python教程就到这了,欢迎继续收看!\n")

     

    本次“只读课堂”的python教程就到这了,欢迎继续收看!

    Processed: 0.010, SQL: 8