我尝试使用
__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())
预计会失败
这与变量命名无关。双下划线只会使变量名称在类定义中表现不同 - 否则它会像任何其他变量一样对待。
您在
__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__