>>> 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
答案 0 :(得分: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 :(得分:2)
撰写y = x
时,您不会更改变量的值。您正在将对象绑定到名称。
在你的例子中
>>> a = [1, 2]
>>> b = a
您有一个对象(列表),其中有两个名称绑定到该对象。当然,当每个不同的名称访问同一个对象时,会反映对该对象的变更。
在你的例子中
>>> x = 10
>>> y = x
>>> y = 100
您有两个正在玩的对象,其值为10
和100
的整数。当您编写y = 100
时,您只需将名称y
重新绑定到另一个对象。名称x
仍绑定到10
。
答案 2 :(得分:1)
您应该考虑python中的所有变量确实是指向对象的指针。
<案例1写作时
x = 10
变量x
是指向值为10
的数字对象的指针。
y = x
变量y
是指向x
当前指向的同一对象的指针。
y = 100
现在,变量y
指向另一个值为100
的数字对象。这显然对x
指向的对象没有影响。
写作时
x = [1, 2]
x
指向一个数组对象,该对象包含两个指向值为1
和2
的数字对象的指针。
y = x
y
现在指向与x
y.append(3)
这不会影响变量y
(这是关键点!),但是通过添加另一个元素来改变它指向的对象(数组)。由于x
也指向同一个对象,因此x
也可以看到更改。
答案 3 :(得分:1)
这就是:你不能实际上真正修改Python中的变量。变量只是值的名称。您可以修改某些类型的值,并且可以“分配”变量,这实际上只会使它们引用(即命名)与之前的值不同的值。
无法修改整数和字符串值。列表和词典可以。编写代码b.append(3)
(其中a
和b
最初引用某些列表值)会导致名称b
用于查找列表值,然后被修改(调用其.append
方法,这会导致更改)。由于a
和b
都指向相同的值,因此更改为“a
”。编写像b = a + [3]
这样的代码会使用连接列表创建一个新值,并使b
引用此新值而不是旧值。 a
引用的值不受影响,就像计算2 + 3 = 5时一样,2仍然与计算之前的2相同。
答案 4 :(得分:-1)
我不太了解python,但我会假设,如果该值是原始类型,则原始变量不受影响。否则,该值只是一个将改变原始变量的参考。