global在python_在Python中使用“global”关键字

在Python中使用“global”关键字

我从阅读文档中了解到,Python有一个单独的函数命名空间,如果我想在该函数中使用全局变量,我需要使用global。

我正在使用Python 2.7,我尝试了这个小测试

>>> sub = ['0', '0', '0', '0']

>>> def getJoin():

... return '.'.join(sub)

...

>>> getJoin()

'0.0.0.0'

即使没有global,似乎事情仍然正常。我能够毫无问题地访问全局变量。

我错过了什么吗? 另外,以下是来自Python文档:

全局声明中列出的名称   不得被定义为正式的   参数或for循环控制   目标,类定义,功能   定义或导入语句。

虽然形式参数和类定义对我有意义,但我无法理解for循环控制目标和函数定义的限制。

10个解决方案

328 votes

关键字global仅对在本地上下文中更改或创建全局变量很有用,尽管创建全局变量很少被认为是一个很好的解决方案。

def bob():

me = "locally defined" # Defined only in local context

print me

bob()

print me # Asking for a global variable

以上将给你:

locally defined

Traceback (most recent call last):

File "file.py", line 9, in

print me

NameError: name 'me' is not defined

如果使用global语句,则变量将在函数范围“可用”之外,有效地成为全局变量。

def bob():

global me

me = "locally defined" # Defined locally but declared as global

print me

bob()

print me # Asking for a global variable

所以上面的代码会给你:

locally defined

locally defined

此外,由于python的性质,您还可以使用global在本地上下文中声明函数,类或其他对象。 虽然我会反对它,因为如果出现问题或需要调试它会导致噩梦。

unode answered 2019-02-17T23:11:32Z

192 votes

虽然您可以在不使用sub关键字的情况下访问全局变量,但如果要修改它们,则必须使用global关键字。 例如:

foo = 1

def test():

foo = 2 # new local foo

def blub():

global foo

foo = 3 # changes the value of the global foo

在您的情况下,您只需访问列表sub。

Ivo Wetzel answered 2019-02-17T23:12:03Z

66 votes

这是访问名称和在范围内绑定它之间的区别。

如果您只是查找变量来读取其值,则可以访问全局和本地范围。

但是,如果您为名称不在本地范围内的变量分配,则将该名称绑定到此范围(如果该名称也作为全局存在,则会隐藏该名称)。

如果您希望能够分配全局名称,则需要告诉解析器使用全局名称而不是绑定新的本地名称 - 这就是'global'关键字的作用。

绑定块中的任何位置都会导致该块中的所有名称都被绑定,这可能会导致一些相当奇怪的后果(例如,UnboundLocalError突然出现在以前工作的代码中)。

>>> a = 1

>>> def p():

print(a) # accessing global scope, no binding going on

>>> def q():

a = 3 # binding a name in local scope - hiding global

print(a)

>>> def r():

print(a) # fail - a is bound to local scope, but not assigned yet

a = 4

>>> p()

1

>>> q()

3

>>> r()

Traceback (most recent call last):

File "", line 1, in

r()

File "", line 2, in r

print(a) # fail - a is bound to local scope, but not assigned yet

UnboundLocalError: local variable 'a' referenced before assignment

>>>

pycruft answered 2019-02-17T23:12:54Z

47 votes

其他答案回答了你的问题。 关于Python中名称的另一个重要事项是,它们在每个范围的基础上是本地的或全局的。

考虑一下,例如:

value = 42

def doit():

print value

value = 0

doit()

print value

您可能猜测value语句将分配给局部变量,而不会影响在value函数外声明的同一变量的值。 您可能会更惊讶地发现上面的代码无法运行。 函数内部的语句print value生成UnboundLocalError.

原因是Python注意到,在函数的其他地方,您指定了名称value,并且value也没有声明为global。这使它成为局部变量。 但是当您尝试打印它时,尚未定义本地名称。 在这种情况下,Python不会像其他语言那样回归到将名称作为全局变量查找。 实际上,如果在函数中的任何位置定义了同名的局部变量,则无法访问全局变量。

kindall answered 2019-02-17T23:13:40Z

12 votes

访问名称和分配名称是不同的。 在您的情况下,您只是访问一个名称。

如果分配给函数中的变量,则假定该变量是本地变量,除非您将其声明为全局变量。 如果没有,则假定它是全球性的。

>>> x = 1 # global

>>> def foo():

print x # accessing it, it is global

>>> foo()

1

>>> def foo():

x = 2 # local x

print x

>>> x # global x

1

>>> foo() # prints local x

2

user225312 answered 2019-02-17T23:14:12Z

6 votes

您可以访问不含关键字global的全局关键字

为了能够修改它们,您需要明确声明关键字是全局的。 否则,关键字将在本地范围内声明。

例:

words = [...]

def contains (word):

global words #

return (word in words)

def add (word):

global words # must specify that we're working with a global keyword

if word not in words:

words += [word]

martynas answered 2019-02-17T23:14:46Z

2 votes

在函数外部声明的任何变量都假定为全局变量,只有在从函数内部(构造函数除外)声明它们时才必须指定该变量是全局变量。

Jesus Ramos answered 2019-02-17T23:15:11Z

0 votes

这意味着您不应该执行以下操作:

x = 1

def myfunc():

global x

# formal parameter

def localfunction(x):

return x+1

# import statement

import os.path as x

# for loop control target

for x in range(10):

print x

# class definition

class x(object):

def __init__(self):

pass

#function definition

def x():

print "I'm bad"

ikostia answered 2019-02-17T23:15:37Z

0 votes

全球使变量“全球”

def out():

global x

x = 1

print(x)

return

out()

print (x)

这使得'x'就像函数外的正常变量一样。 如果你取出全局,那么它会产生错误,因为它无法在函数内打印变量。

def out():

# Taking out the global will give you an error since the variable x is no longer 'global' or in other words: accessible for other commands

x = 1

print(x)

return

out()

print (x)

Michael answered 2019-02-17T23:16:09Z

0 votes

我会举个简单的例子:想想这段代码:

myVar = 0

print (myVar ) # 01 line: returns 0

def func():

myVar = "def"

print (myVar )

func() # 02 line: returns def

print (myVar ) # 03 line: returns 0

正如你所看到的最后一行代码将返回0,因为在函数内部myVar变量没有被重新分配,它只是被修改了它只会在调用函数时改变而不影响主myVar变量,因为它在里面定义了 我们的函数(意思是它是局部变量),但是使用全局关键字:

myVar = 0

print (myVar ) # 01 Line : returns 0

def func():

global myVar

myVar = "def"

print (myVar )

func() # 02 Line : returns def

print (myVar ) # 03 Line : returns def

我们实际上命令python,def中的这个变量不是本地的,使用名为myVar的全局变量来改变它。

a_m_dev answered 2019-02-17T23:16:48Z

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/245312.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

odd raio值 是什麼_乳化油相所需的HLB值

前面有分享过《常用乳化剂HLB值一览表》,为了方便大家查阅HLB值,《有机概念图、HLB值与乳化剂筛选》一文中介绍了HLB值的计算方法以及乳化剂的筛选。今天分享乳化油所需要HLB,方便大家查阅,油相在O/W乳状液和W/O乳状液中所需的HLB值是不同的&…

oracle12c创建schema,Oracle 12c Schema Demo 安装

Oracle 12cR2 schema demo的安装主要参考README.md文件以及Dave的文章:http://www.cndba.cn/dave/article/1985但其中遇到了其他问题(CDB问题),以下记录安装过程以及故障处理。https://www.cndba.cn/9527/article/2303把文件拷贝到$ORACLE_HOME/demo目录…

4k纸是几厘米乘几厘米_4K纸有多大 。。厘米

展开全部4K纸通常长:53cm,宽:38cm。4K纸一般指“四开”大小62616964757a686964616fe4b893e5b19e31333431343039的纸张,目前有“国际大度”和“国际正度”的两种标准。国际大度四开纸的长宽为:5843cm;国际大…

搜狗输入法在idea打不了汉字_IDEA开发软件在linux环境下使用搜狗输入法无法进行中文输入...

IDEA开发软件在linux环境下使用搜狗输入法无法进行中文输入找到bin目录下的idea.sh文件(其他编辑器也是一样如pycharm.sh、clion.sh)。使用文本编译器打开,找到# -----------------# Run the IDE.# -----------------在前面添加export GTK_IM_MODULEfcitxexport QT_…

caj文件浏览器_caj文件怎么转换成pdf文件?试试这样操作,3步成功转换

诸位小伙伴用过caj文件吗?和pdf文件类似,也和电子书格式有点像,是我们办公中会用到的格式文件,不过假如你分享了一份caj格式的文档给别人,如果他们的电脑上没有安装对应的浏览器,则无法打开、阅读文件哦。鉴…

oracle 小计 排序,使用SQL实现小计,合计以及排序

--说明:个人学习笔记,实现小计合计显示,分组按BANK_IDOP_DATE升序排序复制代码 代码如下:--测试数据CREATE TABLE #TB(ID VARCHAR(10),BANK_ID VARCHAR(10),OP_DATE VARCHAR(10),OPERATOR_NO VARCHAR(20),AMT DECIMAL(10,2))INSERT #TB SELEC…

猜数大小编程c语言_猜数正确编程

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼#include "time.h"#include "stdlib.h"#include "stdio.h"main(){char c;clock_t start,end;time_t a,b;double var;int i,guess;srand(time(NULL));printf("do you want to play it.(y or n) …

python人脸识别门禁_用Python做人脸识别

之前用facenet做了一个人脸识别的Demo,所以在此记录一下。但因为我的水平十分有限,疏漏之处请多见谅。1,这个流程大致是先用mtcnn检测人脸位置,得到一个人脸的bounding box。2,然后用opencv根据上一个bounding box把人脸裁剪出来&…

linux thrift 安装目录,Linux下安装Thrift

Linux下安装Thrift0.11.0版本下载地址:http://mirrors.hust.edu.cn/apache/thrift/0.11.0/thrift-0.11.0.tar.gz执行如下命令安装Thrift依赖:apt-get install automake bison flex g git libboost1.55 libevent-dev libssl-dev libtool make pkg-config1…

微信电脑客户端登陆_电脑端的微信只能开一个?简单操作就能随意开

微信已经成为工作和生活的必备交流工具,每个人几乎都拥有微信号,而且有些人还会注册两个或多个,用以区分工作和私人。但同时登陆多个账号却成为了难题,现在手机上多开已经很方便,而在电脑上默认只能登录一个&#xff0…

基于单片机的自动追日系统设计_基于单片机的自动浇花系统的设计

龙源期刊网http://www.qikan.com.cn基于单片机的自动浇花系统的设计作者:吴蓓张阳来源:《现代信息科技》2018年第03期摘要:为了解决人们生活中由于工作繁忙或无人照料而带来的浇花难的问题,本文基于AT89C51单片机设计了一款自动浇…

linux系统遵循以下哪项协议,实务(互联网技术)通信工程师考试习题库

第一章数据通信基础一、单选题1、对于一个物理网络,数据的最大传输单元是由(协议)决定的。2、在当前的数据通信网络中,存在以下交换方式(电路方式、分组方式、帧方式、信元方式)。3、与电路交换方式相比,分组交换方式的优点是(提高了线路的有…

vue 直接访问静态图片_vue中本地静态图片路径写法

这篇文章给大家介绍了vue中本地静态图片路径写法及Vue.js中引用图片路径的方式,需要的朋友参考下吧 这里写图片描述 需求:如何components里面的index.vue怎样能把assets里面的图片拿出来。 1.在img标签里面直接写上路径: 2.利用数组保存再循环输出: {{ item.title }} data:…

win10下装黑苹果双系统_win10远程双系统重装电脑维修7黑苹果笔记本安装做虚拟机服务mac8...

时间很宝贵,如果您的网速满足需求,我们装机时间不超过30分钟哦联系我们专业/靠谱/安全/快捷专业电脑医生优秀团队只服务为您!组装品牌电脑电脑游戏电脑卡顿中毒故障系统电脑虚拟/电脑多开/开机硬件不成功不收费!统统我来解决聚集于电脑各种症状专业远程在线电脑修复电脑问题分分…

linux svn同步到本地目录,LINUX中SVN服务的搭建与实现SVN 自动同步到web目录,SVN自动启动...

一,下载相关软件:[rootlocalhost test]# wget http://subversion.tigris.org/downloads/subversion-1.6.1.tar.gz[rootlocalhost test]# wget http://subversion.tigris.org/downloads/subversion-deps-1.6.1.tar.gz二,安装及配置&#xff1a…

485 九针头_张元英安宥真还是孩子,手臂还有疫苗接种痕迹,九针头太吓人

点击右上角“关注”,了解韩娱等最新娱乐消息Izone四月携迷你二辑《HEART*IZ》回归,成绩喜人,不仅拿到了六个一位,在Oricon第一周的周专辑排行榜中位居1位,是唯一进入Oricon周专辑排行榜前五名的韩国专辑。不仅如此&…

结构体内元素不确定_氮长叶,磷长果,那么生物菌肥能长啥?看完终于不纠结了...

农民朋友们都知道,“庄稼一枝花,全靠肥当家”,肥料对于作物产量的高低起着决定性因素。蔬菜的产量、品质、病虫害、早衰、死亡、落花、落果、干尖干叶等都与肥料有着密切的关系。如今市面上肥料种类五花八门,有氮磷钾肥、中微量元…

linux中iptable中端口,Linux如何打开iptables中的端口

举例:开放10000端口的解决步骤如下:1、修改/etc/sysconfig/iptables文件,增加如下一行:-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 10000 -j ACCEPT重启 iptablesservice iptables restart2、重启防火墙…

umi权限路由_Umi 小白纪实(三)—— 震惊!路由竟然如此强大!

在《Umi 小白纪实(一)》中有提到过简单的路由配置和使用,但这只是冰山一角借用一句广告词,Umi 路由的能量,超乎你的想象一、基本用法Umi 的路由根结点是全局 layout src/layouts/index.js路由会将相应的页面组件映射到上面的 props.children…

openssl 添加自定义算法_GitHub:用PyTorch实现17种深度强化学习算法

【新智元导读】深度强化学习已经在许多领域取得了瞩目的成就,并且仍是各大领域受热捧的方向之一。本文推荐一个用 PyTorch 实现了 17 种深度强化学习算法的教程和代码库,帮助大家在实践中理解深度 RL 算法。深度强化学习已经在许多领域取得了瞩目的成就&…