a = b. 修改b不会改变a

-1 投票
3 回答
87 浏览
提问于 2025-04-14 15:24
input1 = input()

a = None
b = None

if input1 == "Bleeb":
    a = 1
    b = a

if a == 1:
    a = 2

print(a)
print(b)

2
1

这是打印出来的内容

a和b被设置成相等——它们之间没有区别,实际上只是用不同的方式来表示同样的东西。

但是在第二个if语句中修改a并不会影响b。

我该怎么解决这个问题呢?

3 个回答

-1

从数学上讲,你说的完全没问题。 但在计算机编程中,我们把 a=b 这个表达式理解为“把 b 的值赋给 a,这个过程只发生一次。”

如果你想让它们始终保持相同的值,你可能需要用一个循环来实现,比如说: 如果 a 不等于 b,那就把 a 赋值为 b,同时把 b 赋值为 a。 这样一来,每当你改变 a 或 b 的值时,这个变化就会被同步到另一个变量上。

0

我看不出解释器的行为有什么问题。在第一次赋值 b = a 之后,b 这个名字就和 a 没有任何关系了。所以,改变 a 的值不会影响 b 的值。

下面的代码可以展示这一点:

input1 = "Bleeb"

a = None
b = None

if input1 == "Bleeb":
    a = 1
    b = a

print("Id of a is: ", id(a))
print("Id of b is: ", id(b))

if a == 1:
    a = 2
    
print("Id of a is: ", id(a))
print("Id of b is: ", id(b))

print(a)
print(b)

看看输出结果,你会看到一个全新的对象。

Id of a is:  134928572468136
Id of b is:  134928572468136
Id of a is:  134928572468168
Id of b is:  134928572468136
2
1
5

这里有一个关于你代码运行情况的可视化说明:

在输入之后,ab 都被赋值为 None

a: ─┐    2
    │    1 
b: ─┴──► None

这里提到的值 1 和 2 是因为它们在程序后面会用到。

当第一个 if 条件为真时,我们把 1 赋值给 a,这意味着 a 不再和 b 指向同一个值:

a: ─┐    2
    └──► 1 
b: ────► None

接着执行 b = a,这样 ab 又都指向同一个值了。

a: ─┐    2
    ├──► 1
b: ─┘    None

然后进入第二个 if 块,这时 a 被赋值为 2。就像之前给 a 赋值一样,这样 ab 又不再指向同一个值了:

a: ────► 2
    ┌──► 1
b: ─┘    None

一个解决方案:包含目标值的对象

如果 ab 指向的是可以改变的对象,那么你可以把目标值存储在一个对象的 属性索引 中。下面是如何用列表来实现这一点:

input1 = input()

a = None
b = None

if input1 == "Bleeb":
    a = [1]  # Note that A now references a list containing the value
    b = a    # B references the same list

if a and a[0] == 1:  # Look at the contained value when a is no longer None
    a[0] = 2   # A doesn't get a different reference, but its element does
 
print(a)  # [2]
print(b)  # [2]  -- the same list

撰写回答