修改赋值变量时会影响原始变量的值吗?

2 投票
5 回答
892 浏览
提问于 2025-04-17 03:27
>>> x = 10
>>> y = x
>>> y = 100
>>> y # Changes on y will not be transferred to x
100
>>> x
10

>>> x2 = 'hello'
>>> y2 = x2
>>> y2 = 'world'  # Changes on y2 will not be transferred to x2
>>> y2
'world'
>>> x2
'hello'    

>>> a = [1, 2]
>>> b = a
>>> b.append(3) # Changes on b will be transferred to a
>>> b
[1, 2, 3]
>>> a
[1, 2, 3]

>>> x1 = {}
>>> y1 = x1
>>> y1['h'] = 'hhh'  # Changes on y1 will be transferred to x1
>>> y1
{'h': 'hhh'}
>>> x1
{'h': 'hhh'}

问题> 在哪些情况下,被赋值的变量会影响原始变量的值?

Python版本:Python 3.1.2

5 个回答

2

当你写 y = x 的时候,其实并不是在改变一个变量的值,而是在把一个对象和一个名字绑定在一起。

在你的例子中

>>> a = [1, 2]
>>> b = a

你有一个对象(一个列表),这个对象有两个名字和它绑定在一起。自然地,当你对这个对象进行修改时,通过不同的名字访问这个对象时,看到的变化都是一样的。

在你的例子中

>>> x = 10
>>> y = x
>>> y = 100

你有两个对象在运作,分别是值为 10100 的整数。当你写 y = 100 的时候,你只是把名字 y 重新绑定到了另一个对象上。名字 x 仍然绑定着 10

3
  • 在某些情况下,你可能会重新绑定其中一个名字,但另一个名字没有改变,这样它们就分别指向了不同的对象。

    y = 100      # Rebind y. Doesn't change x.
    y2 = 'world' # Rebind y2. Doesn't change x2.
    
  • 在其他情况下,你是在修改这个对象。那么两个名字都会看到这个对象的变化。

    b.append(3)      # Mutates the list that both a and b are bound to.
    y1['h'] = 'hhh'  # Mutates the dictionary that both x1 and y1 are bound to.
    
1

你需要明白,在Python中,所有的变量其实都是指向对象的指针。

案例 1

当你写

x = 10

变量 x 是指向一个值为 10 的数字对象的指针。

y = x

而变量 y 也是指向与 x 相同的对象。

y = 100

现在,变量 y 改为指向一个值为 100 的另一个数字对象。这显然不会影响 x 指向的对象。

案例 2

当你写

x = [1, 2]

x 指向一个数组对象,这个数组里包含两个指向值为 12 的数字对象的指针。

y = x

此时,y 也指向与 x 相同的数组。

y.append(3)

这不会影响变量 y(这是关键点!),但会通过添加另一个元素来改变它所指向的对象(这个数组)。因为 x 也指向同一个对象,所以这个变化在 x 中也能看到。

撰写回答