增加实例属性与增加全局属性(范围)

时间:2014-08-25 19:25:31

标签: python scope instance local

class blah(object):
  def __init__(self):
    self.x=5

blahinstance=blah()

def testclass():
  blahinstance.x+=1
  print blahinstance.x

testclass()  #blah will be incremented

print blahinstance.x #the incremented value holds after function exit
"------------------------------------------------------------------------------------"

x=5

def test():
  x+=1
  print x

print x
test() #fails because ref before assignemnt

因此,我们在本地范围内具有读访问权限和修改对全局变量的访问权限,但显然重新分配的尝试只会创建一个与全局变量同名的局部变量。在上面的示例中,引用位于函数范围之外的实例属性blahinstance.x有何不同?对我来说,这些例子非常相似,但一个失败,一个失败。尽管此对象位于全局范围内,但blahinstance.x的第二个示例与x类似,我们在使用{{1}}之前没有引用错误。

澄清 - 我完全理解第二个例子,以及全局和本地范围。我不明白为什么第一个有效,因为它看起来与第二个相似。是因为实例对象及其属性是可变的,我们是否已读取/修改本地范围内全局变量的访问权限?

1 个答案:

答案 0 :(得分:0)

裸名称与属性引用不同。

没有名称blahinstance.x。名称为blahinstance,其引用的对象具有名为x的属性。当您执行blahinstance.x += 2之类的操作时,您引用的唯一变量是blahinstance,并且您没有为blahinstance分配新值,所以一切都很好。在x中使用blahinstance.x对于blahinstance完全是“内部”的,而x根本不是变量,它只是一个属性名称。

“赋值前引用的局部变量”业务仅在分配给变量时发挥作用 - 即,裸名称 - 不是属性引用,项引用或其他任何内容。在这方面,blahinstance.x += 2somelist[1] += 2没有区别;第一种情况下的x不再是局部变量,而是第二种情况下的索引1