疑问

  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,如代码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的回答。

总结

  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. 创建JavaScript的哈希表Hashtable

    Hashtable是最常用的数据结构之一,但在JavaScript里没有各种数据结构对象.但是我们可以利用动态语言的一些特性来实现一些常用的数据结构和操作,这样可以使一些复杂的代码逻辑更清晰,也更符合 ...

  2. JavaScript去除数组中的重复值

    用原型函数(prototype)可以定义一些很方便的自定义函数,实现各种自定义功能. Javascript 中的原型函数(prototype)的工作原理,在 javascript 中每次声明新函数的过 ...

  3. dubbox小demo

    概述: 我们建立两个web项目,一个是service负责提供服务,另一个是web项目负责调用服务. 两个项目都是 maven Project 项目 生产者项目: 项目中主要就是: pom文件,引入相关 ...

  4. js for等循环 跳出多层循环

    js for 循环 跳出多层循环 ,,,,,,,]; // 8个数 ,,,,,,,]; //8个数 testFor(); console.log(') function testFor() { ;k& ...

  5. (第三章,第四章)http报文内的http信息,返回结果的http状态码

    第三章 http报文内的http信息 用于http协议交互的信息被称为http报文,包括请求报文和响应报文. 1.编码提升传输速率,在传输时编码能有效的处理大量的访问请求.但是编码的操作是计算机完成的 ...

  6. python基础--结构篇

    在C/C++/Java中,main是程序执行的起点,Python中,也有类似的运行机制,但方式却截然不同: Python使用缩进对齐组织代码的执行,所有没有缩进的代码(非函数定义和类定义),都会在载入 ...

  7. PHP 数据加密

    <?php /** * * 加密 * */ function lock_url($txt, $key = "aiteng") { $chars = "ABCDEFG ...

  8. Chrome profile manager

    由于Firefox有profile manager这么一说,所以自然联想到chrome应该也有. 默认chrome的profile manager被禁止了. 1. chrome://flags 2. ...

  9. 洛谷金秋夏令营模拟赛 第2场 T11737 时之终末

    这道题就是道状压dp...比赛的时候太贪心 然后状压又不好 所以T2 T3一起挂了QAQ 吸取教训QAQ f[i][j][k]表示前i个数选了j个 最后a个的状态为k的答案 #include<c ...

  10. 【洛谷 P3187】 [HNOI2007]最小矩形覆盖 (二维凸包,旋转卡壳)

    题目链接 嗯,毒瘤题. 首先有一个结论,就是最小矩形一定有条边和凸包重合.脑补一下就好了. 然后枚举凸包的边,用旋转卡壳维护上顶点.左端点.右端点就好了. 上顶点用叉积,叉积越大三角形面积越大,对应的 ...