如何使列表(或任何其他值)不可变:Python 中的真正常量?

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

在一个旧的讨论中我找到了输入

Final
的参考。我尝试了文档中的示例

y: Final[Sequence[str]] = ['a', 'b'] y.append('x') # Error: "Sequence[str]" has no attribute "append" z: Final = ('a', 'b') # Also works
但与文档相反,它将 

y

 转变为 
['a','b','x']
,没有错误。我使用的是Python 3.11。这是怎么回事?此外:2024 年用 Python 创建不可变常量的最新技术是什么?

python-3.x constants immutability
1个回答
0
投票
类型检查器只能提示您(“静态”)您在这里做错了什么。在运行时,Python 解释器并不关心类型提示的内容。 (除非您使用像 Pydantic 这样的库来强制执行此操作,但它超出了此处的范围)

我们来谈谈

Final

。来自文档:

typing.Final

类型限定符用于指示不应重新分配、重新定义或覆盖变量或属性

正在谈论作业!不是突变。

.append()

变异”对象。您的 y
 仍然指向同一个列表。所以它不会阻止你。这就是为什么您没有看到任何与此相关的错误。该错误表示 
Sequence
 类型不可变。为此,您应该使用 
MutableSequence

您可以使用

tuple

 代替可变列表(它们也有其他差异)或创建您自己的类似列表的类:
https://stackoverflow.com/a/22340603/13944524

© www.soinside.com 2019 - 2024. All rights reserved.