修改赋值变量时会影响原始变量的值吗?
>>> 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
你有两个对象在运作,分别是值为 10
和 100
的整数。当你写 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
指向一个数组对象,这个数组里包含两个指向值为 1
和 2
的数字对象的指针。
y = x
此时,y
也指向与 x
相同的数组。
y.append(3)
这不会影响变量 y
(这是关键点!),但会通过添加另一个元素来改变它所指向的对象(这个数组)。因为 x
也指向同一个对象,所以这个变化在 x
中也能看到。