python中global变量释疑
疑问
- 为什么main中不能写global x语句?
- 在函数中如何修改global变量?
- 在main中修改了global变量后,在子进程中为什么没有效果?
- 如何利用进程池的initializer参数(函数)修改子进程中的global变量?
代码如下:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2018/9/1 8:21
# @Author : dswang from multiprocessing import Pool, current_process VAR0 = 'module' def f0(change=False):
print 'in func f0, pid:{}'.format(current_process().pid)
# time.sleep(2)
if change:
global VAR0
VAR0 = 'f0'
print VAR0 def ps_init():
global_dct = globals()
print "global_dct.keys():", global_dct.keys()
print 'VAR0 in global:', global_dct.get('VAR0')
global VAR0
VAR0 = 'ps'
print 'VAR0 in global:', global_dct.get('VAR0') if __name__ == '__main__':
VAR0 = 'main'
pool = Pool(processes=1, initializer=ps_init)
pool.apply(func=f0, args=()) f0()
f0(True)
print 'in main, pid:{}'.format(current_process().pid)
print 'VAR0 in main:'
print VAR0 print 'the end'
结果为:
global_dct.keys(): ['f0', 'VAR0', '__builtins__', '__file__', '__package__', 'current_process', '__name__', '__doc__', 'Pool', 'ps_init']
VAR0 in global: module
VAR0 in global: ps
in func f0, pid:
ps
in func f0, pid:
main
in func f0, pid:
f0
in main, pid:
VAR0 in main:
f0
the end
解疑
1、为什么main中不能写global x语句?
因为 if __name__ == '__main__': 语句并不开辟新的作用域,所以main中的变量VAR0已经是在全局作用域,
再写关键字global是多余的,会报错:
SyntaxWarning: name 'VAR0' is assigned to before global declaration global VAR0.
2、在函数中如何修改global变量?
在函数中修改global变量,需要先声明变量为global,如代码16和24行中,在函数f0中的“global VAR0”语句。
3、在main中修改了global变量后,在子进程中为什么没有效果?
注:6216是主进程,6504是子进程。
从运行结果中看到(结果第2行):子进程中的VAR0并没有因为main中的修改而改变,
依然保持module中的值“module”。当子进程中修改后,VAR0变成了“ps”,在随后f0函数中依然是"ps"。
然后,回到main中(代码34行),VAR0为main中修改后的“main”。最后,main中函数f0对VAR0再次修改为“f0”,
因此,VAR0在f0和main中都变成了“f0”,见结果第9和第12行。
4、如何利用进程池的initializer参数(函数)修改子进程中的global变量?
参考代码和问题3的回答。
总结
- if语句不开辟新的作用域,因此不能在main中写global关键字,直接修改即可;
- 函数中要修改全局变量,需要先声明为全局变量:global x;
- 子进程中的全局变量取module中的值,main中修改module的全局变量不影响子进程。
python中global变量释疑的更多相关文章
- Python中的变量和常量
本文主要介绍Python中的变量和常量,包括变量的命名规范,使用注意事项 -------------- 完美的分割线 --------------- 1.变量 1.1.变量理解 1)什么是变量 变量即 ...
- python中的变量与对象
一. 什么是变量 变量就是以前学习的数学中常见的等式x = 3(x是变量,3是变量值),在编程中,变量不仅可以是数学,还可以是任意数据类型 二. 变量的命名规则 变量名必须是英文大小写.数字和_的组合 ...
- Python中的变量和作用域详解
Python中的变量和作用域详解 python中的作用域分4种情况: L:local,局部作用域,即函数中定义的变量: E:enclosing,嵌套的父级函数的局部作用域,即包含此函数的上级函数的局部 ...
- python中的变量和数据类型
一.变量定义:变量是计算机内存中的一块区域,存储规定范围内的值,值 可以改变,通俗的说变量就是给数据起个名字. 二.变量命名规则: 1. 变量名由字母.数字.下划线组成 2. 数字不能开头 3. 不可 ...
- Python中的变量、引用、拷贝和作用域
在Python中,变量是没有类型的,这和以往看到的大部分编辑语言都不一样.在使用变量的时候,不需要提前声明,只需要给这个变量赋值即可.但是,当用变量的时候,必须要给这个变量赋值:如果只写一个变量,而没 ...
- Python 中的变量
Python采用基于值得内存管理模式,赋值语句的执行过程是:首先把等号右侧标识的表达式计算出来,然后在内存中找一个位置把值存放进去,最后创建变量并指向这个内存地址.Python中的变量并不直接存储值, ...
- Python中的变量引用对象需注意的几点
Python中的变量引用对象需注意的几点 分类:Python (55) (0) 普通引用: Python中,变量的作用仅仅是一个标识,只有赋值后才被创建,它可以引用任何类型的对象,而且在引用之前必须 ...
- Python中执行变量而非字符串
Python中执行变量而非字符串 设想这样的场景,你需要大型项目的开发.但是项目的开发第一步是啥? 当然是import导入了. ...but............ 默认 import 后面跟着字符串 ...
- python学习(九)python中的变量、引用和对象的关系
<Think In Java>中说到过"万事万物皆对象",这句话也可以用在Python中. 感觉Python中的变量有点像Javascript中的变量,是弱类型的,但是 ...
随机推荐
- mysql五补充部分:SQL逻辑查询语句执行顺序
一 SELECT语句关键字的定义顺序 SELECT DISTINCT <select_list> FROM <left_table> <join_type> JOI ...
- 剑桥offer(11~20)
11.题目描述 输入一个整数,输出该数二进制表示中1的个数.其中负数用补码表示. class Solution { public: int NumberOf1(int n) { ; unsigned ...
- 《python核心编程》--读书笔记 第21章 数据库编程
准备:今天拿笔记本装了mysql,这样就能在不同地方用其他电脑远程访问同一个数据库了. python安装MySQLdb模块:http://www.codegood.com/downloads. 21. ...
- 牛客练习赛42 出题的诀窍(数学+hash)
出题的诀窍 题目链接:https://ac.nowcoder.com/acm/contest/393/C 题解: 由于他是在每一行选取一个元素,然后纵向来比较,这里行的顺序是不会影响的,所以我们将每一 ...
- logrotate配置和使用
logrotate是linux自带的日志管理工具.服务器如果不对日志进行滚动操作,单个日志文件的增长速度极快,不利于日志查找和问题定位.而logrotate能够自动完成日志的截断.压缩和滚动操作. 安 ...
- linux和windows多线程的异同
linux多线程及线程同步和windows的多线程之间的异同 并不是所有的程序都必须采用多线程,有时候采用多线程性能还不如单线程.采用多线程的好处如下: (1)多线程之间采用相同的地址空间,共享大部分 ...
- SQL Server 代理(已禁用代理 XP)
sp_configure 'show advanced options', 1; GO RECONFIGURE WITH OVERRIDE; GO sp_configure 'Agent XPs', ...
- [Luogu 2596] ZJOI2006 书架
[Luogu 2596] ZJOI2006 书架 第一次指针写 FHQ_Treap(省选噩梦数据结构)AC 啦! 省选试机写它,紧张过度失败了. 省选 Day 1 考场写它,写挂了. 省选 Day 1 ...
- RSA host key has changed 错误
RSA host key for mysharebook.cn has changed and you have requested strict checking.Host key verifica ...
- google protobuf序列化原理解析 (PHP示例)
一.简介 Protocol Buffers是谷歌定义的一种跨语言.跨平台.可扩展的数据传输及存储的协议,因为将字段协议分别放在传输两端,传输数据中只包含数据本身,不需要包含字段说明,所以传输数据量小, ...