python全局变量的一些思考
来源:互联网 发布:天涯明月刀有mac版吗 编辑:程序博客网 时间:2024/05/28 06:04
问题的引出:
x = 5def Func(): x *= x print(x)Func()
报错信息
Traceback (most recent call last): File "new 2.py", line 5, in <module> Func() File "new 2.py", line 3, in Func x *= xUnboundLocalError: local variable 'x' referenced before assignment
这里为什么说x在赋值前被引用错误呢?明明我声明了一个全局变量x啊(这是一个c/c++程序员的想法^_^!!!),在c语言中这样做确实没有问题。如下:
int x = 5;void fun(void){ x *= x; print("%d", x);}int main(void){ fun();}
但是为什么在python里面就行不通了呢?
python里面的变量有些类似于C语言中的指针变量,你这样一想的话,有些问题就明白了。比如说为什么python里面的list可以容纳不同类型的变量?又比如说python里面变量声明时不区分类型?另外,还要知道的一点是,python在赋值时,会为数值分配一块内存空间,然后通过变量去指向这块内存空间。如果修改变量的值,实际上就是变量指向了不同的内存空间。如下:
>>> a = 1>>> id(a)1802679360>>> a = 3>>> id(a)1802679424
ok,回到原来的问题。x*=x
相当于x = x*x
,也就是左边的x指向了右边生成的内存空间,这里要注意,前后x指向的内存发生了变化,如下
x = 5def Func(): global x print(id(x)) x*=x print(id(x)) print(x)Func()
结果是
1802679488180268012825
当这个变量在右边的时候相当于取内存操作,python里面如果要对一个全局变量取内存操作的话,必须要提前声明这个变量是global
的,也就是上面代码里的做法。关键问题来了,我函数里的x不可以取外面x的内存里的东西吗?可以!!!
x = 5print(id(x))def Func(): print(id(x)) print(x)Func()
结果是
180267948818026794885
并没有出现问题,而且前后的x是同一个,而且我没有声明global。分析这个例子和上面的例子不难发现问题所在,问题出现在这个赋值操作上。所以我们大致总结为以下几点:
- 如果函数中出现赋值操作,则左边的变量会被标记为局部变量,如果变量名和函数外的变量名重名,函数外的变量将会被屏蔽。这时如果想要使用函数外的变量的话,要做global声明。
- 如果函数中没有出现赋值操作,那么函数中可以直接使用全局变量
阅读全文
0 0
- python全局变量的一些思考
- 关于MySQL的全局变量与会话变量的一些思考
- 对Python、shell的一些思考
- 对Python、shell的一些思考
- 对Python、shell的一些思考
- 对Python、shell的一些思考
- python import caffe的一些思考
- 对Python、shell的一些思考
- C语言和python全局变量的一些区别
- 全局变量的一些注意
- Python 全局变量的使用
- python的全局变量应用
- python全局变量的使用
- python 的一些思考(字符,django,动态语言)
- 关于python导入模块和package的一些深度思考
- PHP学习笔记:全局变量的思考
- 软件工程的一些思考
- FacadeLayer的一些思考
- QTcpServer使用信号槽单线程方式直接处理连进来的客户端(短连接或少数据处理)
- 关于Android Studio中点9图的编译错误问题
- Android进阶---android databinding 使用
- gethostbyname()函数说明
- env
- python全局变量的一些思考
- Java数据结构与算法之数据结构-逻辑结构-集合(二)------集合类分述图描述
- <Java开发工具类一> -- StringUtils
- JS 数据类型的检测-关键字typeof与关键字instanceof
- Snapshot volume
- SVN服务器的本地搭建和使用
- spring boot集成mybatis使用swiper.js制作中秋祝福H5并打成jar包发布到服务器
- unity游戏毕设
- C# WinForm窗体及其控件自适应各种屏幕分辨率