python局部赋值的规则

代码如下:

myVar = 1

def myfunc():
    myVar += 1

myfunc()

会提示错误:

UnboundlocalError: local variable 'myVar' referenced before assignment

Python提出如下假设:如果在函数体内的任何地方对变量赋值,则Python将名称添加到局部命名空间中。

语句myVar += 1对名称myVar赋值,则myVar是函数myfunc的局部命名空间的一部分,而它当前没有关联值,所以会产生错误。

解决方法:使用global语句

代码如下:

myVar = 1

def myfunc():
    global myVar
    myVar += 1

myfunc()

附作用域搜索规则:

L:本地的(Local)

E:封闭的(Eclosing)

G:全局的(Global)

B:内置的(Built-in) 

(0)

相关推荐

  • Python中的赋值、浅拷贝、深拷贝介绍

    和很多语言一样,Python中也分为简单赋值.浅拷贝.深拷贝这几种"拷贝"方式. 在学习过程中,一开始对浅拷贝理解很模糊.不过经过一系列的实验后,我发现对这三者的概念有了进一步的了解. 一.赋值 赋值算是这三种操作中最常见的了,我们通过一些例子来分析下赋值操作: str例 复制代码 代码如下: >>> a = 'hello' >>> b = 'hello' >>> c = a >>> [id(x) for x in

  • python赋值操作方法分享

    一.序列赋值: x,y,z = 1,2,3 我们可以看作:x = 1,y = 2,z = 3 二.链接赋值: x = y = 1print id(x)print id(y) 大家可以看下,2个执行的结果是一样的.说明变量x和y都是存储了整数对象1的引用地址. 三.增量赋值. 比如x = x + 1 我们可以改成x+=1 掌握上面的3点,相信你对赋值操作有一个很好的了解了.

  • Python赋值语句后逗号的作用分析

    本文实例讲述了Python赋值语句后逗号的作用.分享给大家供大家参考.具体分析如下: IDLE 2.6.2 >>> a = 1 >>> b = 2, >>> print type(a) <type 'int'> >>> print type(b) <type 'tuple'> >>> c = [] >>> d = [], >>> print type(c)

  • 跟老齐学Python之赋值,简单也不简单

    变量命名 在<初识永远强大的函数>一文中,有一节专门讨论"取名字的学问",就是有关变量名称的问题,本温故而知新的原则,这里要复习: 名称格式:(下划线或者字母)+(任意数目的字母,数字或下划线) 注意:  1.区分大小写  2.禁止使用保留字  3.遵守通常习惯  •以单一下划线开头的变量名(_X)不会被from module import *语句导入的.  •前后有下划线的变量名(X)是系统定义的变量名,对解释器有特殊意义.  •以两个下划线开头,但结尾没有两个下划线的变

  • python实现同时给多个变量赋值的方法

    本文实例讲述了python实现同时给多个变量赋值的方法.分享给大家供大家参考.具体分析如下: python中可以同时给多个变量赋值,下面列举了三种方法 # Assign values directly a, b = 0, 1 assert a == 0 assert b == 1 # Assign values from a list (r,g,b) = ["Red","Green","Blue"] assert r == "Red&q

  • 整理Python中的赋值运算符

    下表列出了所有Python语言支持的赋值运算符.假设变量a持有10和变量b持有20,则: 例如: 试试下面的例子就明白了所有在Python编程语言可供选择的赋值运算符: #!/usr/bin/python a = 21 b = 10 c = 0 c = a + b print "Line 1 - Value of c is ", c c += a print "Line 2 - Value of c is ", c c *= a print "Line 3

  • 深入理解Python中变量赋值的问题

    前言 在Python中变量名规则与其他大多数高级语言一样,都是受C语言影响的,另外变量名是大小写敏感的. Python是动态类型语言,也就是说不需要预先声明变量类型,变量的类型和值在赋值那一刻被初始化,下面详细介绍了Python的变量赋值问题,一起来学习学习吧. 我们先看一下如下代码: c = {} def foo(): f = dict(zip(list("abcd"), [1, 2 ,3 ,4])) c.update(f) if __name__ == "__main__

  • 深入解析Python中的变量和赋值运算符

    Python 变量类型 变量存储在内存中的值.这就意味着在创建变量时会在内存中开辟一个空间. 基于变量的数据类型,解释器会分配指定内存,并决定什么数据可以被存储在内存中. 因此,变量可以指定不同的数据类型,这些变量可以存储整数,小数或字符. 变量赋值 Python中的变量不需要声明,变量的赋值操作既是变量声明和定义的过程. 每个变量在内存中创建,都包括变量的标识,名称和数据这些信息. 每个变量在使用前都必须赋值,变量赋值以后该变量才会被创建. 等号(=)用来给变量赋值. 等号(=)运算符左边是一

  • python实现给数组按片赋值的方法

    本文实例讲述了python实现给数组按片赋值的方法.分享给大家供大家参考.具体如下: 这段代码可以直接给数组的第5-7个元素赋值 inventory = ["sword", "armor", "shield", "healing potion"] inventory[4:6] = ["orb of future telling"] print inventory 运行结果如下: ['sword', 'arm

  • python局部赋值的规则

    复制代码 代码如下: myVar = 1 def myfunc():    myVar += 1 myfunc() 会提示错误: UnboundlocalError: local variable 'myVar' referenced before assignment Python提出如下假设:如果在函数体内的任何地方对变量赋值,则Python将名称添加到局部命名空间中. 语句myVar += 1对名称myVar赋值,则myVar是函数myfunc的局部命名空间的一部分,而它当前没有关联值,所

  • 基于Python函数的作用域规则和闭包(详解)

    作用域规则 命名空间是从名称到对象的映射,Python中主要是通过字典实现的,主要有以下几个命名空间: 内置命名空间,包含一些内置函数和内置异常的名称,在Python解释器启动时创建,一直保存到解释器退出.内置命名实际上存在于一个叫__builtins__的模块中,可以通过globals()['__builtins__'].__dict__查看其中的内置函数和内置异常. 全局命名空间,在读入函数所在的模块时创建,通常情况下,模块命名空间也会一直保存到解释器退出.可以通过内置函数globals()

  • 浅谈Python中的作用域规则和闭包

    在对Python中的闭包进行简单分析之前,我们先了解一下Python中的作用域规则.关于Python中作用域的详细知识,有很多的博文都进行了介绍.这里我们先从一个简单的例子入手. Python中的作用域 假设在交互式命令行中定义如下的函数: >>> a = 1 >>> def foo(): b = 2 c = 3 print "locals: %s" % locals() return "result: %d" % (a + b

  • 详解Python直接赋值,深拷贝和浅拷贝

    直接赋值: 对象的引用,也就是给对象起别名 浅拷贝: 拷贝父对象,但是不会拷贝对象的内部的子对象. 深拷贝: 拷贝父对象. 以及其内部的子对象 在之前的文章中,提到可变对象和不可变对象,接下来也是以这两者的区别进行展开 直接赋值 对于可变对象和不可变对象,将一个变量直接赋值给另外一个变量,两者 id 值一致,其实本质上是将变量量绑定到对象的过程. >>> a=1 >>> b=a >>> id(a) == id(b) True >>>

  • Python变量赋值的秘密分享

    在Python中,我们令一个变量等于另外一个变量时,并不是把值传递给它,而是直接把指向的地址更改了.我们想要查看一个变量在内存中的地址,可以通过id(变量) 来查看.我们通过一个小例子来看看这个有趣的过程. >>> x = 12 >>> y= 13 >>> id(x) >>> id(y) >>> x = y >>> id(x) >>> id(y) 首先给x变量赋值为12,y变量赋值

  • python变量赋值方法(可变与不可变)

    python中不存在所谓的传值调用,一切传递的都是对象的引用,也可以认为是传址. 一.可变对象和不可变对象 Python在heap中分配的对象分成两类:可变对象和不可变对象.所谓可变对象是指,对象的内容可变,而不可变对象是指对象内容不可变. 不可变(immutable):int.字符串(string).float.(数值型number).元组(tuple) 可变(mutable):字典型(dictionary).列表型(list) 不可变类型特点: 看下面的例子(例1) i = 73 i +=

  • 详解Python列表赋值复制深拷贝及5种浅拷贝

    概述 在列表复制这个问题,看似简单的复制却有着许多的学问,尤其是对新手来说,理所当然的事情却并不如意,比如列表的赋值.复制.浅拷贝.深拷贝等绕口的名词到底有什么区别和作用呢? 列表赋值 # 定义一个新列表 l1 = [1, 2, 3, 4, 5] # 对l2赋值 l2 = l1 print(l1) l2[0] = 100 print(l1) 示例结果: [1, 2, 3, 4, 5] [100, 2, 3, 4, 5] 可以看到,更改赋值后的L2后L1同样也会被更改,看似简单的"复制"

  • Python直接赋值、浅拷贝与深度拷贝实例分析

    本文实例讲述了Python直接赋值.浅拷贝与深度拷贝.分享给大家供大家参考,具体如下: 直接赋值:其实就是对象的引用(别名). 浅拷贝(copy):拷贝父对象,不会拷贝对象的内部的子对象. 深拷贝(deepcopy): copy 模块的 deepcopy 方法,完全拷贝了父对象及其子对象. 字典浅拷贝实例 实例 >>>a = {1: [1,2,3]} >>> b = a.copy() >>> a, b ({1: [1, 2, 3]}, {1: [1,

  • python批量赋值操作实例

    变量名和变量值俊发生规律的变化,利用for循环完成赋值操作. 举个例子: for i in range(1, 10): exec("t%d=i"%i) print(t1) print(t2) print(t3) print(t4) print(t5) print(t6) print(t7) print(t8) print(t9) 执行结果: 1 2 3 4 5 6 7 8 9 利用python中的exec()函数来完成. 以上这篇python批量赋值操作实例就是小编分享给大家的全部内容

  • Python二元赋值实用技巧解析

    这篇文章主要介绍了Python二元赋值实用技巧解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 python支持类似于a += 3这种二元表达式.比如: a += 3 -> a = a + 3 a -= 3 -> a = a - 3 a *= 3 -> a = a * 3 ... 在python中的某些情况下,这种二元赋值表达式可能比普通的赋值方式效率更高些.原因有二: 二元赋值表达式中,a可能会是一个表达式,它只需计算评估一次,而a

随机推荐