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

本文通过实例讲解了Python中的作用域,包括全局变量、局部变量、生命周期以及如何使用`global`关键字在函数中修改全局变量。还讨论了参数传递时的引用问题,介绍了如何避免变量同步,以确保函数内部操作不影响外部数据。
摘要由CSDN通过智能技术生成

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教程就到这了,欢迎继续收看!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值