对python变量的理解_我对Python变量范围和类定义的理解正确吗?

我是Python的新手,目标版本是2.6,并考虑到与3.x的前向兼容性。我试着把我的脑袋绕到从哪里可以访问哪些变量的问题上。我已经花了很多时间阅读/理解这个主题,最后我想确认一下我对这个主题理解的准确性。

我想我得到的是:

您可以将Python脚本的“顶层”视为包含程序中所有其他内容的“根对象”。它与其他实例化对象类似,但具有特殊功能:您可以从任何函数或类访问其成员(变量、函数、类),而无需“self”

您可以首先使用“global”

任何函数/方法,无论嵌套多深,都可以访问它上面任何地方分配的所有变量。如果变量是可变对象,则可以更改其成员,而不管该变量是根对象的成员还是更深层次的嵌套对象。在

如果使用现有变量名在函数内赋值,则会创建一个具有相同名称的新局部变量,该变量的范围仅限于该函数。如果嵌套函数中有多个同名的局部变量,则访问最近的封闭局部变量。在

如果变量是根对象的成员(即存在于脚本的顶层),并且在分配变量名之前使用了“global”,则不会创建新的局部变量,因此赋值应用于根对象的成员。在python3中,“nonlocal”可以类似地用于将变量赋值应用于最近的封闭函数的成员,其中变量被赋值。在

因为函数在执行时创建一次,所以作为默认参数赋值的对象将在对函数的多次调用中保持不变。如果对象是可变的,如果函数没有将变量名重新分配给另一个值,则对其成员的更改也将在对函数的调用中持久化。在

上面的规则适用于类内部,但您需要通过“self”从其方法内部引用类成员,并通过对类的引用或类的实例化从类外部引用类成员。在

您可以在方法之外的类中执行语句,就像“根对象”那样;但是,它们在执行类定义时立即执行,而不是。然后,可以通过引用类本身从类外部访问类成员。这就好像在定义类时,它被实例化为“类对象”,使用对象的自己的名称,而不调用构造函数。进一步的实例化是初始实例化(类对象)在任何状态下的浅拷贝,如果存在,则执行构造函数。当引用类对象而不是实例化时,变量是可访问的,但是方法不能被调用,除非它们被@classmethod(允许访问类成员)或@staticmethod(不允许)。在

在实例化期间只复制对类成员的引用,因此任何不在方法内的赋值都是在类的所有实例化之间共享的“类变量”。与函数一样,对实例化对象中相同变量名的赋值将创建一个新变量,其作用域仅限于该对象,但对可变对象成员的更改将在类的所有实例化中看到,包括类对象,因为这些对象中的变量都引用同一个可变对象。为了防止在同一个类的实例化之间共享变量,可以使用“self”在方法中分配变量。在

类存在于它定义的任何范围内(例如,它可以在函数内,并且除非函数返回对类的引用,或将其分配给它有权访问的外部变量,例如通过全局/非局部、类变量或可变对象的成员,否则不能访问该类。在

那么,我了解Python的作用域了吗?谢谢你的任何和所有的洞察力。在

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值