gpt4 book ai didi

python - 如何在python中使变量不可变

转载 作者:太空狗 更新时间:2023-10-30 00:20:11 25 4
gpt4 key购买 nike

我的 python 脚本:

N = 2  # 2*2 matrix

a = N * [0]
b = a

print(b) # prints [0, 0]

for i in range(N):
a[i] = N * [0]

for i in range(N):
for j in range(N):
a[i][j] = 0

print(a) # prints [[0, 0], [0, 0]]

print(b) # prints [[0, 0], [0, 0]]

为什么我的第二个 print(b) 改变了?如何让它不可变?我希望我的 b 仍然包含 [0, 0]

最佳答案

您对 Python 中的“对象”和变量赋值的理解存在缺陷。

在像 C 这样的语言中,当您定义一个变量(例如 int a)时,会为该变量分配和保留一小块内存区域,a 现在是指的是这个内存区域的东西。您可以深入此区域,更改它,然后发现 a 现在“具有”不同的值。像 a = 2(或 a = b,其中 b 是另一个变量)这样的语句获取右侧的值并将其写入为 a 保留的内存位置。现在您可以根据需要修改 b,但 a 仍将保留原始值。这就是为什么你可以在 C 中做类似 a++ 的事情,这意味着,“获取 a 所指的值,将其加一并将其写回相同的位置”。

在 Python 中,当您说 x = [] 时,会创建一个新的列表对象,并且 x 会“指向”该列表。现在,您对 x 所做的任何更改都会影响此对象。假设您说 y = x,您将获得对同一对象的另一个引用。更改 y(或 x)将更改现在由 xy 指向的对象。这就是您对 B = A 作业所做的。当你通过 B 访问它时,通过 A 对该对象所做的所有事情都将是可见的,因为它们都指向同一个对象。从这个意义上讲,Python 中的所有变量都像 C 中的指针。您还可以理解为什么我们在 Python 中没有 ++ 运算符,因为像这样修改内存位置的内容是没有意义的C、

到目前为止,其他人建议的解决方案建议您创建一个内容与 A 指向的列表完全相同的新对象,并让 B 指向这个复制。这样,如果您修改 A(或 A 指向的内容),B(或 B 指向的内容) 将保持不变。

然而,这不会使 B 成为“不可变的”(即无法就地修改的对象)。但是,我认为您只是错误地使用了这个词,意思是您不希望发生别名。

关于python - 如何在python中使变量不可变,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5511128/

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