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}}之前没有引用错误。
澄清 - 我完全理解第二个例子,以及全局和本地范围。我不明白为什么第一个有效,因为它看起来与第二个相似。是因为实例对象及其属性是可变的,我们是否已读取/修改本地范围内全局变量的访问权限?
答案 0 :(得分:0)
裸名称与属性引用不同。
没有名称blahinstance.x
。名称为blahinstance
,其引用的对象具有名为x
的属性。当您执行blahinstance.x += 2
之类的操作时,您引用的唯一变量是blahinstance
,并且您没有为blahinstance
分配新值,所以一切都很好。在x
中使用blahinstance.x
对于blahinstance
完全是“内部”的,而x
根本不是变量,它只是一个属性名称。
“赋值前引用的局部变量”业务仅在分配给变量时发挥作用 - 即,裸名称 - 不是属性引用,项引用或其他任何内容。在这方面,blahinstance.x += 2
与somelist[1] += 2
没有区别;第一种情况下的x
不再是局部变量,而是第二种情况下的索引1
。