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

时间:2011-09-30 20:26:40

标签: python

>>> 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 个答案:

答案 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

您有两个正在玩的对象,其值为10100的整数。当您编写y = 100时,您只需将名称y重新绑定到另一个对象。名称x仍绑定到10

答案 2 :(得分: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也可以看到更改。

答案 3 :(得分:1)

这就是:你不能实际上真正修改Python中的变量。变量只是的名称。您可以修改某些类型的值,并且可以“分配”变量,这实际上只会使它们引用(即命名)与之前的值不同的值。

无法修改整数和字符串值。列表和词典可以。编写代码b.append(3)(其中ab最初引用某些列表值)会导致名称b用于查找列表,然后被修改(调用其.append方法,这会导致更改)。由于ab都指向相同的值,因此更改为“a”。编写像b = a + [3]这样的代码会使用连接列表创建一个新值,并使b引用此新值而不是旧值。 a引用的值不受影响,就像计算2 + 3 = 5时一样,2仍然与计算之前的2相同。

答案 4 :(得分:-1)

我不太了解python,但我会假设,如果该值是原始类型,则原始变量不受影响。否则,该值只是一个将改变原始变量的参考。