gpt4 book ai didi

python - 在类外部定义的函数的范围是什么?

转载 作者:行者123 更新时间:2023-12-01 00:06:18 24 4
gpt4 key购买 nike

class player(object):
def __init__(self, a, b):
self.a = a
self.b = b


def foo():
x += 2
obj.a += 10

obj = player(0,0)
x = 4

foo()

我知道我的 foo 函数无法为局部变量 x 赋值,因为它之前是在 foo 外部全局定义的> 范围。然而,对于变量 a 来说,不会出现同样的问题,它是 player 类中实例 obj 的属性,而该实例又具有与函数foo()无关。除了 x += 2 的错误之外,我预计 obj.a 中会出现错误,即,我认为 foo() 不应该能够修改 obj.a,但确实如此!也许它应该抛出与 x += 2 相同的错误,不是吗?

最佳答案

所有增强赋值都有效地对三个方法调用之一进行脱糖,但只有在一种情况下才执行实际赋值。

  1. 如果左侧是名称,则 x += y脱糖至x = x.__iadd__(y) 。因为这是一个普通的赋值语句,所以解析器会生成 x局部变量(除非前面有 global xnonlocal x )。无论范围如何,x必须已经有一个值,以便可以计算右侧。换句话说,x不是自由变量。

  2. 如果左侧是索引名称,则 x[i] += y脱糖至x.__setitem__(i, x[i] + y) 。如果x尚未定义为局部变量,它是一个自由变量,因此将解析为该值的x在第一个封闭范围内。

  3. 如果左侧是属性查找,则 x.a = y脱糖至 x.__setattr__('a', x.a + y) 。再次,x是一个自由变量,除非是局部变量 x已经存在。

关于python - 在类外部定义的函数的范围是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59954542/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com