疑问

  1. 为什么main中不能写global x语句?
  2. 在函数中如何修改global变量?
  3. 在main中修改了global变量后,在子进程中为什么没有效果?
  4. 如何利用进程池的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,如代码1624行中,在函数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的回答。

总结

  1. if语句不开辟新的作用域,因此不能在main中写global关键字,直接修改即可;
  2. 函数中要修改全局变量,需要先声明为全局变量:global x;
  3. 子进程中的全局变量取module中的值,main中修改module的全局变量不影响子进程。

python中global变量释疑的更多相关文章

  1. Python中的变量和常量

    本文主要介绍Python中的变量和常量,包括变量的命名规范,使用注意事项 -------------- 完美的分割线 --------------- 1.变量 1.1.变量理解 1)什么是变量 变量即 ...

  2. python中的变量与对象

    一. 什么是变量 变量就是以前学习的数学中常见的等式x = 3(x是变量,3是变量值),在编程中,变量不仅可以是数学,还可以是任意数据类型 二. 变量的命名规则 变量名必须是英文大小写.数字和_的组合 ...

  3. Python中的变量和作用域详解

    Python中的变量和作用域详解 python中的作用域分4种情况: L:local,局部作用域,即函数中定义的变量: E:enclosing,嵌套的父级函数的局部作用域,即包含此函数的上级函数的局部 ...

  4. python中的变量和数据类型

    一.变量定义:变量是计算机内存中的一块区域,存储规定范围内的值,值 可以改变,通俗的说变量就是给数据起个名字. 二.变量命名规则: 1. 变量名由字母.数字.下划线组成 2. 数字不能开头 3. 不可 ...

  5. Python中的变量、引用、拷贝和作用域

    在Python中,变量是没有类型的,这和以往看到的大部分编辑语言都不一样.在使用变量的时候,不需要提前声明,只需要给这个变量赋值即可.但是,当用变量的时候,必须要给这个变量赋值:如果只写一个变量,而没 ...

  6. Python 中的变量

    Python采用基于值得内存管理模式,赋值语句的执行过程是:首先把等号右侧标识的表达式计算出来,然后在内存中找一个位置把值存放进去,最后创建变量并指向这个内存地址.Python中的变量并不直接存储值, ...

  7. Python中的变量引用对象需注意的几点

    Python中的变量引用对象需注意的几点 分类:Python (55)  (0) 普通引用: Python中,变量的作用仅仅是一个标识,只有赋值后才被创建,它可以引用任何类型的对象,而且在引用之前必须 ...

  8. Python中执行变量而非字符串

    Python中执行变量而非字符串 设想这样的场景,你需要大型项目的开发.但是项目的开发第一步是啥? 当然是import导入了. ...but............ 默认 import 后面跟着字符串 ...

  9. python学习(九)python中的变量、引用和对象的关系

    <Think In Java>中说到过"万事万物皆对象",这句话也可以用在Python中. 感觉Python中的变量有点像Javascript中的变量,是弱类型的,但是 ...

随机推荐

  1. 爬虫实例——爬取淘女郎相册(通过selenium、PhantomJS、BeautifulSoup爬取)

    环境 操作系统:CentOS 6.7 32-bit Python版本:2.6.6 第三方插件 selenium PhantomJS BeautifulSoup 代码 # -*- coding: utf ...

  2. hdu 1698 线段树 区间更新 区间求和

    Just a Hook Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  3. CCPC-Winter Camp div2 day8 A

    ---恢复内容开始--- 题目: 题解: 我们考虑第i个叶子节点的情况,根据题目给的输入条件,我们可以知道,深度大的节点的序号一定是大于深度浅的节点的序号的 如图 题目要求我们找出每一个叶子节点距离编 ...

  4. Linux查看内核和系统版本

    1. 查看内核版本命令: 1) [root@q1test01 ~]# cat /proc/version Linux version 2.6.9-22.ELsmp (bhcompile@crowe.d ...

  5. 【C++对象模型】第一章 关于对象

    1.C/C++区别 C++较之C的最大区别,无疑在于面向对象,C程序中程序性地使用全局数据.而C++采用ADT(abstract data tpye)或class hierarchy的数据封装.类相较 ...

  6. String.replaceAll()方法替换字符串中的反斜杠(\)

    replaceAll()方法实际是采用正则表达式的规则去匹配的. 在regex中"\\"表示一个"\",在java中一个"\"也要用&quo ...

  7. Jmeter-12-如何使用Plugin Manager

    1. 搜索 Jmeter plugin 并找到plugin manager 下载jar文件 2. 放到jmeter/lib/ext下面, 重启jmeter 3. 找到选项-> Plugin ma ...

  8. 深入浅出MyBatis:JDBC和MyBatis介绍

    JDBC相关概念 Java程序都是通过JDBC连接数据库的,通过SQL对数据库编程,JDBC是由SUN公司提出的一些列规范,只定义了接口规范,具体实现由各个数据库厂商去实现,它是一种典型的桥接模式. ...

  9. javascript工厂模式、单例模式

    //工厂模式 function createObject(name,age){ var obj = new Object(); obj.name = name; obj.age = age; obj. ...

  10. windows+nexus+maven环境搭建(转)

    windows nexus环境搭建 1.下载nexus 版本为 nexus-2.11.4-01-bundle 下载地址 这里写链接内容 2.将下载好的文件放到D盘进行解压 3.解压后目录结构 nexu ...