首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么赋值给与局部变量同名的类属性会引发NameError?

赋值给与局部变量同名的类属性会引发NameError的原因是因为在Python中,当在类的方法中使用赋值语句给一个变量赋值时,Python会默认将该变量视为局部变量。当赋值语句执行时,Python会首先在当前作用域中查找该变量,如果找到了则将值赋给该变量,如果没有找到则会创建一个新的局部变量。

在类中,类属性是属于类的,而不是属于类的实例。当我们给与局部变量同名的类属性赋值时,Python会将该赋值语句视为给局部变量赋值,而不是给类属性赋值。因此,当我们在类的方法中使用赋值语句给一个与类属性同名的变量赋值时,Python会在当前作用域中查找该变量,由于该变量是局部变量而不是类属性,所以会引发NameError。

为了避免这种情况,我们可以使用self关键字来引用类属性。self表示当前实例对象,通过使用self关键字,我们可以明确地告诉Python我们要引用的是类属性而不是局部变量。例如:

代码语言:txt
复制
class MyClass:
    my_attribute = 10

    def my_method(self):
        self.my_attribute = 20

my_object = MyClass()
print(my_object.my_attribute)  # 输出: 10
my_object.my_method()
print(my_object.my_attribute)  # 输出: 20

在上面的例子中,我们使用self.my_attribute来引用类属性my_attribute,并成功地给它赋值为20。这样就避免了与局部变量同名的问题。

腾讯云相关产品和产品介绍链接地址:

  • 腾讯云云服务器(CVM):提供弹性计算能力,满足各种业务需求。产品介绍链接
  • 腾讯云云数据库 MySQL 版:高性能、可扩展的关系型数据库服务。产品介绍链接
  • 腾讯云云原生容器服务(TKE):提供高度可扩展的容器化应用管理平台。产品介绍链接
  • 腾讯云人工智能开放平台(AI Lab):提供丰富的人工智能服务和工具,帮助开发者构建智能化应用。产品介绍链接
  • 腾讯云物联网开发平台(IoT Explorer):提供全面的物联网解决方案,支持设备接入、数据管理和应用开发。产品介绍链接
  • 腾讯云移动推送(TPNS):提供高效、稳定的移动消息推送服务,帮助开发者实现消息通知功能。产品介绍链接
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

谈谈Python:为什么私有属性可以在外部赋值并访问

Python:为什么私有属性可以在外部赋值并访问?...问题引入 在慕课网上学习Python**私有属性**时候,看到了一个同学提问: 将count改为__count,为什么实例变量在外部仍然可以修改__count?这里print p1....__count赋值操作,其实是在p1中定义了一个名为__count变量(因为Python中都是动态变量),而没有改变中真正属性。...所以我们在外部用“属性名”访问私有属性时候,触发AttributeError,从而实现“私有属性特性。但通过“属性名”也可以访问这些属性。...以上这篇谈谈Python:为什么私有属性可以在外部赋值并访问就是小编分享给大家全部内容了,希望能给大家一个参考。

2.8K10

Python 中变量作用域

试图打印其作用域之外局部变量引发NameError 异常。...>>> greet()                            Hello Steve>>> name'Steve' Copy 但是,如果我们在函数内部为全局声明变量赋值,则会在函数命名空间中创建一个新局部变量...此赋值不会改变全局变量值。...greet()                            Hello Bill>>> name                                'Bill' Copy 也可以同时使用同名全局变量和局部变量...Steve'def greet():     globals()['name'] = 'James'     name='Steve'     print ('Hello ', name) Copy 上述代码结果显示了具有相同名全局变量和局部变量之间冲突以及如何解决该冲突

15830

详解Python变量作用域

本文暂时不讨论定义中变量(成员)作用域,改天可能单独成文介绍。...x >>> demo() #本次调用修改了全局变量x值 3 4 >>> x 3 >>> y #局部变量在函数运行结束之后自动删除 NameError: name 'y' is not defined...如果局部变量与全局变量具有相同名字,那么该局部变量会在自己作用域内隐藏同名全局变量,例如下面的代码所演示。..., spam) 上面的代码运行结果为: 局部变量赋值后: 原来值 nonlocal变量赋值后: 我不是局部变量,也不是全局变量 全局变量赋值后: 我不是局部变量,也不是全局变量 全局变量: 我是全局变量...思考题:如果有下面的框架,要求把其中pass替换为有效代码,实现并模拟数据结构中“双链表”,你怎么写呢?

1.5K80

命名空间和作用域

②全局名称(global names),模块中定义名称,记录了模块变量,包括函数、、其它导入模块、模块级变量和常量。...这就很容易理解为什么在函数内部声明局部变量覆盖掉在模块中声明同名变量。...如果找不到变量 runoob,它将放弃查找并引发一个 NameError 异常:  NameError: name 'runoob' is not defined。 ...)Python 中,程序变量并不是在哪个位置都可以访问,访问权限决定于这个变量是在哪里赋值。(局部变量只能在其被声明函数内部访问)变量作用域决定了在哪一部分程序可以访问哪个特定变量名称。...():     b = 20     def inner_func():         c = 30 a = 10  在函数inner_func中,我们可以对局部变量c进行读取操作和赋值操作,而只能对非局部变量

1.1K30

python中常见错误及解决方法

python常见错误有 1.NameError变量名错误 2.IndentationError代码缩进错误 3.AttributeError对象属性错误 详细讲解 1.NameError变量名错误 报错...在实际编写代码过程中,报NameError错误时,查看该变量是否赋值,或者是否有大小写不一致错误,或者说不小心将变量名写错了。...enumerate spam = ['cat', 'dog', 'mouse'] for i, item in enumerate(spam): print(i, item) 函数中局部变量赋值前被使用...myFunction() 导致:UnboundLocalError: local variable ‘someVar’ referenced before assignment 当函数中有一个与全局作用域中同名变量时...,它会按照 LEGB 顺序查找该变量,如果在函数内部局部作用域中也定义了一个同名变量,那么就不再到外部作用域查找了。

77910

Python抛出异常_python抛出异常作用

在python中不同异常可以用不同类型(python中统一了与类型,类型即)去标识,不同对象标识不同异常,一个异常标识一种错误 AttributeError #试图访问一个对象没有的树形...#Python代码非法,代码不能编译(个人认为这是语法错误,写错了) TypeError #传入对象类型与要求不符合 UnboundLocalError #试图访问一个还未被设置局部变量...,基本上是由于另有一个同名全局变量,导致你以为正在访问它 ValueError #传入一个调用者不期望值,即使值类型是正确 # 其他异常 ArithmeticError AssertionError..., 结果为raise一个AssertionError出来 用sys模块回溯最后异常 当发生异常时Python回溯异常,给出大量提示,可能会给程序员定位和纠错带来一定困难,这是可以使用sys模块回溯最近一次异常...: 引发异常: ValueError('a 不为 1',) """ 自定义异常 #定义一个异常,继承Exception class Networkerror(Exception): def __

2.5K70

Python基础之变量进阶

可变类型和不可变类型 修改可变类型 是修改数据内容,而不会修改变量引用地址;修改可变类型,要用对象.方法()进行修改; 重新赋值修改变量引用地址; 不可变类型,内存中数据不允许被修改: 数字类型...不同函数内同名局部变量 不同函数间可以定义相同名局部变量,彼此之间互不关联,这就像1班有一个小明,2班也有一个小明,但他们并不是同一个人; def demo1(): num = 10...但是,在python中,函数内部不能直接修改全局变量值,如果用全局变量名在函数内部重新赋值,本质上只是创建一个同名局部变量而已; num = 10 def demo1(): # 这个语句...并不是修改全局变量值,而是创建一个同名局部变量 num = 90 print("demo1num", num) def demo2(): print("demo2num...,使用global声明一下变量即可; global关键字告诉解释器后面声明变量是一个全局变量,这样,再使用赋值语句时,就不会创建局部变量了。

60010

Python 常见异常列表

常见Python异常 异常 描述 AssertionError assert(断言)语句失败 AttributeError 试图访问一个对象没有的属性,比如foo.x ,但是foo没有x这个属性。...基本上是路径问题 IndentationError 语法错误,代码没有正确对齐 IndexError 下标索引超出序列边界,比如当x只有三个元素,却试图访问x[5] KeyError 试图访问字典里不存在键...KerboardInterrupt Ctrl + C 被按下 NameError 使用一个还未被赋值予对象变量 SyntaxError Python代码非法,代码不能解释 TypeError 传入对象类型与要求不符...UnboundLocalError 试图访问一个还未被设置局部变量,基本上是由于另一个同名全局变量,导致你以为正在访问它 ValueError 传入一个调用者不期望值,即使值类型是正确 Python

1.4K10

【Python进阶】Python中异常处理

(1) AttributeError:试图访问一个对象没有的属性,比如foo.y,但是foo没有属性y (2) IOError:输入/输出异常;基本上是无法打开文件 (3) ImportError...代码不能编译 (10) TypeError:传入对象类型与要求不符合 (11) UnboundLocalError:试图访问一个还未被设置局部变量,基本上是由于另有一个同名全局变量,才导致你以为正在访问它...下面我们就来创建一个自定义异常Error,基为Exception,用于在异常触发时输出更多信息。...,如果引发异常,则执行过程跳到第一个except语句。...如果第一个except中定义异常与引发异常匹配,则执行该except中语句。如果引发异常不匹配第一个except,则会搜索第二个except。

1.1K30

python 变量和作用域

变量作用域 python 中,程序变量并不是在哪个位置都可以访问,访问权限决定于这个变量是在哪里赋值。 变量作用域决定了在哪一部分程序可以访问哪个特定变量名称。...)     age = 23 change_name(name) print(age) 执行报错 NameError: name 'age' is not defined 全局变量 在程序一开始定义变量称为全局变量...在子程序中定义变量称为局部变量,在程序一开始定义变量称为全局变量。...全局变量作用域是整个程序,局部变量作用域是定义该变量子程序。 当全局变量与局部变量同名时: 在定义局部变量子程序内,局部变量起作用;在其它地方全局变量起作用。...稍微复杂一点,比如列表,字典,集合,,都是可以在函数内部更改

67430

异常处理(第十一章)内有福利

>0这个语句判断为假时会报错 因为my_list只有“tianjun”这个字符串,pop()弹出后my_list为空,下面assert等式不成立,所以抛出异常 attributeerror尝试访问未知对象属性...出错了not readable 余总赠书,名额有限,还不上车 知识回顾 常见异常: Exception 所有异常(当不知道具体异常可用这个处理) AssertionError...assert语句失败 AttributeError 特性应用或赋值引发(试图访问一个对象没有的属性) IOError 试图打开不存在文件或者无全新文件等操作时...,就会引发(输入输入异常,基本是无法打开文件) ImportError 无法引入模块或包,基本是路径问题 IndexError 在使用系列中不存在索引时引发(...试图访问一个还未被设置全局变量,基本上是由于另有一个同名全局变量 ValueError 传入一个不被期望值,即使类型正确 ZeroDivisonError 在除数为零发生一个异常

48620

Objective C之Block浅谈

编译器在遇到Block时候, 如果是不带有__block修饰符外部局部变量进行变量拷贝,不支持在Block内部修改外部局部变量。...通过NSLog(@“%p”,&obj),可以输出不同内存地址。修改obj属性影响到Block中同名obj属性,因为他们共享相同对象。...但是如果对外部对象直接赋值,外部对象和Block中同名对象就指向不同内存块了,这时候再修改外部对象属性就不会改变Block同名对象了。...在ARC模式中,对于不带有__block修饰符对象,Block自动增加该对象引用计数,而带有__block修饰符局部对象,对象移到堆去,没有增加引用计数,这也是为什么在block外给带有__block...修饰符局部变量赋值,有可能导致原来对象dealloc函数立即触发。

51620

【Python3之异常处理】 转

AttributeError 试图访问一个对象没有的属性,比如foo.x,但是foo没有属性x IOError 输入/输出异常;基本上是无法打开文件 ImportError 无法引入模块或包;基本上是路径问题或名称错误...TypeError 传入对象类型与要求不符合 UnboundLocalError 试图访问一个还未被设置局部变量,基本上是由于另有一个同名全局变量,导致你以为正在访问它 ValueError...常规错误 StopIteration 迭代器没有更多值 GeneratorExit 生成器(generator)发生异常来通知退出 StandardError 所有的内建标准异常...内存溢出错误(对于Python 解释器不是致命) NameError 未声明/初始化对象 (没有属性) UnboundLocalError 访问未初始化本地变量 ReferenceError...#如果引发了'name'异常,获得附加数据 else: #如果没有异常发生 ?

1.2K20

深入了解Python 变量作用域

只有当变量在Module(模块)、Class()、def(函数)中定义时候,才会有作用域概念。 1....Python程序因为“如果内部函数有引用外部函数同名变量或者全局变量,并且对这个变量有修改.那么python认为它是一个局部变量,又因为函数中没有n定义和赋值,所以报错 # y = n...在Python中,使用一个变量时并不严格要求需要预先声明它,但是在真正使用它之前,它必须被绑定到某个内存对象(被定义、赋值);这种变量名绑定将在当前作用域中引入新变量,同时屏蔽外层作用域中同名变量...G(global)全局作用域 即在模块层次中定义变量,每一个模块都是一个全局作用域。也就是说,在模块文件顶层声明变量具有全局作用域,从外部开来,模块全局变量就是一个模块对象属性。...如果没有找到,则会出发NameError错误。

98721

Python3 常见错误和异常处理

\ KeyboardInterrupt 用户中断执行(通常是输入^C) 用户按下Ctrl-C(或者Delete)终止一个正在运行程序时,产生,重新运行即可 Exception 常规错误 \...)零 (所有数据类型) 0做分母时抛出 AssertionError 断言语句失败 \ AttributeError 对象没有这个属性 当一个属性引用或赋值失败时,产生 EOFError 没有内建输入...,到达EOF 标记 对于类似input或者raw_input这样内置函数,如果在遇到输入流末尾之前没有读到任何数据,产生 EnvironmentError 操作系统错误 \ IOError 输入...,产生异常 MemoryError 内存溢出错误(对于Python 解释器不是致命) 如果一个程序用尽了所有内存,而且可以恢复,产生 NameError 未声明/初始化对象 (没有属性) 如果代码引用了一个名字...,而当前作用域中不存在这个名字,产生 UnboundLocalError 访问未初始化本地变量 一种NameError,特别针对局部变量名 ReferenceError 弱引用(Weak reference

1.5K20

Python两个内置函数——locals 和globals (学习笔记)

如果函数定义了一个局部变量 x,Python将使用   这个变量,然后停止搜索。 2.全局名字空间 - 特指当前模块。...如果Python在这些名字空间找不到 x,它将放弃查找并引发一个 NameError 异常,同时传递 There is no variable named 'x' 这样一条信息。...#局部变量函数locals例子(locals 返回一个名字/值对字典。): [python] view plain copy print?...使用 import module,模块自身被导入, 但是它保持着自已名字空间,这就是为什么你需要使用模块名来访问它函数或属性(module.function) 原因。...但是使用 from module import,实际上是从另一个模块中将指定函数和属性导入到你自己名字 空间,这就是为什么你可以直接访问它们却不需要引用它们所来源模块原因。

29030
领券