a = b. 修改b不会改变a
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
这里有一个关于你代码运行情况的可视化说明:
在输入之后,a
和 b
都被赋值为 None
:
a: ─┐ 2
│ 1
b: ─┴──► None
这里提到的值 1 和 2 是因为它们在程序后面会用到。
当第一个 if
条件为真时,我们把 1 赋值给 a
,这意味着 a
不再和 b
指向同一个值:
a: ─┐ 2
└──► 1
b: ────► None
接着执行 b = a
,这样 a
和 b
又都指向同一个值了。
a: ─┐ 2
├──► 1
b: ─┘ None
然后进入第二个 if
块,这时 a
被赋值为 2。就像之前给 a
赋值一样,这样 a
和 b
又不再指向同一个值了:
a: ────► 2
┌──► 1
b: ─┘ None
一个解决方案:包含目标值的对象
如果 a
和 b
指向的是可以改变的对象,那么你可以把目标值存储在一个对象的 属性 或 索引 中。下面是如何用列表来实现这一点:
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