为什么我在模块作用域定义的 dunder 变量不能从函数作用域识别为 int 而是识别为 list[int]?

问题描述 投票:0回答:1

我尝试使用

__dunder_case__
在模块中将变量设置为“私有”,并在下面的 函数中使用它

我最终将变量名更改为大写命名,并且在使用 python 时忘记了任何私有内容。 我在 Windows 11 上运行 python 3.12.2。 但我无法理解为什么会这样对待......

__use_this__ = 0


def test_out_scope():
    __use_this__ += 1
    return __use_this__


if __name__ == "__main__":
    print(__use_this__)
    print(test_out_scope())
    print(test_out_scope())
    print(test_out_scope())
    print(test_out_scope())

并期望添加变量

__use_this__ = [0]



def test_out_scope():
    __use_this__[0] += 1
    return __use_this__[0]


if __name__ == "__main__":
    print(__use_this__[0])
    print(test_out_scope())
    print(test_out_scope())
    print(test_out_scope())
    print(test_out_scope())

预计会失败

python variables methods private
1个回答
0
投票

这与变量命名无关。双下划线只会使变量名称在类定义中表现不同 - 否则它会像任何其他变量一样对待。

您在

__use_this__ == 0
时看到错误的原因仅仅是因为对非局部变量的引用不正确。因为整数是不可变的 -
+=
不适用于不可变变量。它创建一个新对象(好吧,不是真的,但为了简单起见,我们可以说它确实如此)并将其分配给变量名称。由于您在函数内重新分配名称,因此它被视为本地名称并抛出
UnboundLocalError: cannot access local variable '__use_this__' where it is not associated with a value
。当您修改列表时,它仍然指向同一个列表对象。由于您没有在函数中的任何位置分配它,因此它会在外部作用域中查找引用。

只需将变量标记为

global
即可解决问题。

def test_out_scope():
    global __use_this__
    __use_this__ += 1
    return __use_this__
© www.soinside.com 2019 - 2024. All rights reserved.