设为首页收藏本站

Crossin的编程教室

 找回密码
 立即加入
查看: 9788|回复: 0
打印 上一主题 下一主题

全菊变量和菊部变量

[复制链接]

169

主题

1

好友

733

积分

版主

Rank: 7Rank: 7Rank: 7

跳转到指定楼层
楼主
发表于 2018-6-2 00:30:38 |只看该作者 |倒序浏览

王菊这波热点来得莫名其妙啊,让我们这些“菊外人”一脸懵逼。

前阵子还自我吐槽了下文章的选题,热点没营养,干货没人看。这下好了,找到了热点与干货的完美结合
是谁的小眼睛,还没看Crossin老师?
明确地说,我今天就是来蹭热点话题流量的。(虽然我觉得事件本身也挺有意思的,已成路人粉)

如果你对此感到不适,或对于变量作用域的相关概念已了然于心,那后面的内容就不必看了,谢谢!

但根据我的经验,几乎所有的编程学习者在开始用函数不久之后,都踩过局部变量的坑。几乎每个星期,都会有人在答疑群、知识星球、论坛、微博上问到关于作用域使用不当而导致的问题。(昨天我在微博上刚回答了一个)

所以,如果通过这个略有点恶趣味的热点事件能让你记住“全局变量”、“局部变量”、“形参”、“实参”、“变量作用域”这几个概念,我觉得也挺好啊。

这些内容,在我们的教程里都有,包含在了:【Python 第67课】函数的参数传递 | 【Python 第71课】变量的作用域

这里再帮大家理一下。

首先来看这样一段代码:
  1. def func(x):
  2.     print('x =', x)
  3.     y = 10
  4.     x += y
  5.     print('x =', x)
  6.     return x
  7. a = 5
  8. b = func(a)
  9. print('a =', a)
  10. print('b =', b)
复制代码
输出:
  1. x = 5
  2. x = 15
  3. a = 5
  4. b = 15
复制代码
这里,函数 func 的形参是 x,它只在函数内部有效,也就是作用域仅在函数中,如果在外部调用它,就会报错。变量 a 作为实参传递给函数 func,所以函数里 x 的值就是 a 的值,但 x 不是 a,只是现在它俩一样。变量 y 是函数中定义的局部变量,它的作用域同样也仅在函数中。对 x 进行赋值之后,x 的值发生了变化,但不会影响实参 a 的值。函数的返回值是 x 的值,并赋值给了外部的变量 b,所以 b 的值就是 x 的值,但 b 不是 x,此时 x 已不存在。

理解了上面几条之后,我们再修改一下函数:
  1. def func(x):
  2.     print('x =', x)
  3.     x = 10
  4.     x += x
  5.     print('x =', x)
  6.     return x
  7. x = 5
  8. func(x)
  9. print('x =', x)
复制代码
输出:
  1. x = 5
  2. x = 20
  3. x = 5
复制代码
解读一下:函数 func 的形参是 x。外部变量 x 作为实参传递给函数 func,所以函数里 x 的值就是外部 x 的值,但这两个 x 是两个不同的变量,只是现在值一样。变量 x 在函数中被重新赋值 10,但不会影响外部变量 x 的值。对 x 自身做了累加,此时 x 变成 20。函数的返回值是 x 的值,但没有赋值给任何变量,所以此返回值没任何作用,函数结束。外部的变量 x 仍然是一开始的值 5。但在初学阶段,不建议你这么给变量命名,可能会把自己绕进去。把代码写清楚,多定义几个变量,多分几行代码,反正也不要钱。(除非你是做区块链程序开发)



那如果要在函数内部修改外部的变量可不可以呢?

可以,用全局变量。
  1. def func():
  2.     global x
  3.     x = 10
  4. x = 5
  5. func()
  6. print('x =', x)
复制代码
输出:
  1. x = 10
复制代码
在函数中声明 global x,程序就会知道这个 x 是一个全局变量。此时的 x 就是外部的 x,给它赋值的结果自然在函数结束后依然有效。但这种情况下,你不能再同时将 x 设定为函数的形参。

如果你仅仅需要在函数内部读取外部的参数值而不用修改它的值,那么 global 的声明就不再需要。
  1. def func():
  2.     y = x
  3.     print('y =', y)
  4. x = 5
  5. func()
  6. print('x =', x)
复制代码
输出:
  1. y = 5
  2. x = 5
复制代码
写入时 global 的必要在于区分全局变量和局部变量,而读取不存在这样的问题。

以上就是关于全局变量、局部变量、形参、实参、变量作用域的一些小知识点,更多内容可以查看我们的入门教程。公众号“Crossin的编程教室”里回复关键字 python



最后留一个思考题:
  1. def func(m):
  2.     m[0] = 20
  3.     m = [4, 5, 6]
  4.     return m
  5. l = [1, 2, 3]
  6. func(l)
  7. print('l =', l)
复制代码
思考一下输出会是什么?

然后自己在电脑上或者我们的在线编辑器 Crossin的编程教室 - 在线Python编辑器 里输入代码运行下看看结果,再想想为什么。

欢迎留言给出你的解释。

════其他文章及回答:

如何自学Python | 新手引导 | 精选Python问答 | Python单词表 | 区块链 | 人工智能 | 双11 | 嘻哈 | 爬虫 | 排序算法

欢迎搜索及关注:Crossin的编程教室
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即加入

QQ|手机版|Archiver|Crossin的编程教室 ( 苏ICP备15063769号  

GMT+8, 2024-5-4 13:31 , Processed in 0.025162 second(s), 22 queries .

Powered by Discuz! X2.5

© 2001-2012 Comsenz Inc.

回顶部