鱼C论坛

 找回密码
 立即注册
查看: 2075|回复: 9

[已解决]局部变量和全局变量问题

[复制链接]
发表于 2016-7-27 11:05:22 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
  1.   1 #!/usr/bin/python3
  2.   2 #-*- coding: utf-8 -*-
  3.   3
  4.   4 L = []
  5.   5 num = 0
  6.   6
  7.   7 def func():
  8.   8     L.append(1)
  9.   9     num += 1
  10. 10     print(L, num)
  11. 11     return
  12. 12
  13. 13 if __name__ == '__main__':
  14. 14     func()
  15. 15
复制代码

运行结果:
Traceback (most recent call last):
  File "test.py", line 14, in <module>
    func()
  File "test.py", line 9, in func
    num += 1
UnboundLocalError: local variable 'num' referenced before assignment

  1.   1 #!/usr/bin/python3
  2.   2 #-*- coding: utf-8 -*-
  3.   3
  4.   4 L = []
  5.   5 num = 0
  6.   6
  7.   7 def func():
  8.   8     L.append(1)
  9.   9     #num += 1
  10. 10     print(L, num)
  11. 11     return
  12. 12
  13. 13 if __name__ == '__main__':
  14. 14     func()
  15. 15
复制代码

运行结果:
[1]  0


请问:
1.上述第一个程序中, 列表L和变量num都是全局的为什么L可以更改?num却不能?
2.为什么第二个程序中就可以访问变量num了呢?
最佳答案
2016-7-27 14:36:45
haomingzi 发表于 2016-7-27 14:07
不太明白,如果在函数内部声明一个变量num = 0,那么在函数内部就可以更改他的值了,那它是不是可变对象 ...

呃~~~~~~
这是Pyhton 的锅
py为了简化,把变量的 定义 和 赋值 2个操作合并在一起,
当你试图改变一个变量的值时,比如: x = 1,实际上也是在 定义 x。

所以,尽量在写Python 程序是避免使用同名变量。
在确实需要 改变全局变量的时候,有  global 和 nonlocal 两个关键字作声明。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-7-27 12:07:31 | 显示全部楼层
函数的参数是通过赋值进行对象的传递的,函数能够改变传入的可变对象。整数和字符串属于不可变对象,列表和字典属于可变对象

列表L 和 变量num 不同
L 是可变对象
num 是 不 可变对象
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-7-27 12:17:47 | 显示全部楼层
可以在函数里引用全局变量的值,但是不能改变 ‘不可变对象’的值。
  1. >>> nn=9
  2. >>> def fn():
  3.         print(nn)
  4.        
  5. >>> nn
  6. 9
  7. >>> fn()
  8. 9
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-7-27 14:07:37 | 显示全部楼层
SixPy 发表于 2016-7-27 12:07
函数的参数是通过赋值进行对象的传递的,函数能够改变传入的可变对象。整数和字符串属于不可变对象,列表和 ...

不太明白,如果在函数内部声明一个变量num = 0,那么在函数内部就可以更改他的值了,那它是不是可变对象呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-7-27 14:10:50 | 显示全部楼层
视频中有讲过,不要试图在函数内修改全局变量的值
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-7-27 14:14:07 | 显示全部楼层
小太阳娟儿 发表于 2016-7-27 14:10
视频中有讲过,不要试图在函数内修改全局变量的值

那个列表L算不算全局变量呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-7-27 14:21:18 | 显示全部楼层
haomingzi 发表于 2016-7-27 14:14
那个列表L算不算全局变量呢?

你在看下那个章节的视频~~列表,元组的特殊性
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-7-27 14:36:45 | 显示全部楼层    本楼为最佳答案   
haomingzi 发表于 2016-7-27 14:07
不太明白,如果在函数内部声明一个变量num = 0,那么在函数内部就可以更改他的值了,那它是不是可变对象 ...

呃~~~~~~
这是Pyhton 的锅
py为了简化,把变量的 定义 和 赋值 2个操作合并在一起,
当你试图改变一个变量的值时,比如: x = 1,实际上也是在 定义 x。

所以,尽量在写Python 程序是避免使用同名变量。
在确实需要 改变全局变量的时候,有  global 和 nonlocal 两个关键字作声明。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-7-27 14:49:37 | 显示全部楼层
SixPy 发表于 2016-7-27 14:36
呃~~~~~~
这是Pyhton 的锅
py为了简化,把变量的 定义 和 赋值 2个操作合并在一起,

可是列表L不用加global啊?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-7-27 15:06:33 | 显示全部楼层
小太阳娟儿 发表于 2016-7-27 14:21
你在看下那个章节的视频~~列表,元组的特殊性

有这么一节吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-3-28 18:07

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表