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中的变量,是弱类型的,但是 ...
随机推荐
- noip模拟赛 helloworld
分析:对于第一个点,答案为26^n - 25^n,这个很好想.另外30%的点因为n <= 5,所以可以直接暴力搜索. 数学方法不是很好处理,考虑dp,设f[i][j]为前i位匹配到危险串第j位的 ...
- hzwer分块九题(暂时持续更新)
hzwer分块9题 分块1:区间加法,单点查询 Code #include<bits/stdc++.h> #define in(i) (i=read()) using namespace ...
- HDU1254 bfs
推箱子 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submiss ...
- floor ceil
echo floor(11/10); echo ceil(11/10); swiper 可以用在ajax的success中,如果用ejs拼接的,放ajax里面才可以轮播
- Anaconda创建python(2.7/3.6)的虚拟环境后需要添加ipykernel
今天在工作的过程中遇到这样一个问题:安装完Anaconda利用conda创建了虚拟环境,但是启动jupyter notebook之后却找不到虚拟环境中的python kernel.后来上网找到了解决办 ...
- String StrigBuffer StringBuilder 浅解
1.String是最基本的字符串类,用于表示字符串. 特点:对象内容不可变,但可以通过指向不同的对象来“表示”不同的内容. 使用场景:如果不涉及到内容改变,可以使用String. 注意:如果想将Str ...
- elk相关
curl http://localhost:9200/_aliases?pretty=1 #列出elk中所有索引
- nginx 状态监控
通过查看Nginx的并发连接,我们可以更清除的知道网站的负载情况.Nginx并发查看有两种方法(之所以这么说,是因为笔者只知道两种),一种是通过web界面,一种是通过命令,web查看要比命令查看显示的 ...
- 全面了解Nginx主要应用场景(数漫江湖)
前言 本文只针对Nginx在不加载第三方模块的情况能处理哪些事情,由于第三方模块太多所以也介绍不完,当然本文本身也可能介绍的不完整,毕竟只是我个人使用过和了解到过得.所以还请见谅,同时欢迎留言交流 N ...
- ...args剩余参数用法
剩余参数语法允许我们将一个不定数量的参数表示为一个数组. function sum(...theArgs) { return theArgs.reduce((previous, current) ...