鱼C论坛

 找回密码
 立即注册
查看: 5001|回复: 6

[已解决]为什么python无参函数可以调用作用域外的对象

[复制链接]
发表于 2023-11-4 22:15:37 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
  1. class A:
  2.     def __init__(self):
  3.         self.a = 100

  4. a = A()
  5. def add():
  6.     a.a += 20
  7. add()
  8. print(a.a)
  9. ## 输出结果:120
复制代码

想问一下为什么add()可以调用作用域外的a.a
a.a并没有传参进去,也没有用关键字global
最佳答案
2023-11-5 23:12:23
我去运行了一下,第一个的报错是:
UnboundLocalError: local variable 'b' referenced before assignment
意思是在赋值之前引用了局部变量“b”。我就记起来这个是要用global的,b本来是全局变量,在函数add()内部,当你尝试修改b的值时,Python会将其视为新的局部变量,并且你不能直接修改全局变量的值。
总的就是,全局变量和实例对象的作用范围这种,可以说是规则吧是不同的,对于全局变量,你要用global来修改其值,而对于实例对象的属性,你可以直接通过实例对象来访问和修改。这种东西有时候没有个为什么,因为像是个规则一样的,自己记住就好,就是这种区别,但是我讲一下自己的理解吧(不一定对):
   变量的作用域是由其定义的位置决定的。全局变量是在函数外部定义的,可以在整个程序中访问。而局部变量是在函数内部定义的,只能在函数内部访问。在函数内部修改一个全局变量时,Python会将其当作一个新的局部变量处理,而不可以直接修改全局变量的值。我觉得这种设计像在大型程序中,都说全局变量的使用应该尽量避免嘛。通过将变量限定在函数内部或类的实例中,可以减少变量之间的相互影响,提高代码的模块化和可重用性。然后说类,类和对象嘛,对象就是可以有自己的属性,有自己的一种特定的属性方法一样的,设计这样的一种访问调用规则可以用起来更加方便灵活


个人的解答和看法,如有错误还请包涵

本帖被以下淘专辑推荐:

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2023-11-4 22:19:40 | 显示全部楼层
yinda_peng 发表于 2023-11-4 22:18
你这个a不是全局变量嘛
  1. class A:
  2.     def __init__(self):
  3.         self.a = 100
  4. b = 10
  5. a = A()
  6. def add():
  7.     b += 10
  8.     a.a += 20
  9. add()
  10. print(a.a)
  11. print(b)
复制代码
你看看这段代码全局变量b就会报错
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-11-4 22:25:35 | 显示全部楼层

  1. b = 10
  2. def add():
  3.     b += 10
  4. add()
  5. print(b)
复制代码

兄弟们咋回事啊,变量就会报错,实例对象就不会报错,
  1. class A:
  2.     def __init__(self):
  3.         self.a = 100
  4. a = A()
  5. def adda():
  6.     a.a +=10
  7. adda()
  8. print(a.a)
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2026-4-1 22:25

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表