Python 何时修改指定变量会影响原始变量的值?

Python 何时修改指定变量会影响原始变量的值?,python,Python,问题>在哪些情况下,指定变量的值会影响该值 原始变量的数量 Python版本: Python 3.1.2我对Python了解不多,但我会假设如果值是primitve类型,则它不会影响原始变量。否则,该值仅为将更改原始变量的参考值。 在某些情况下,您将重新绑定其中一个名称,而不是另一个名称,因此它们现在绑定到不同的对象 >>> x = 10 >>> y = x >>> y = 100 >>> y # Changes on y

问题>在哪些情况下,指定变量的值会影响该值 原始变量的数量


Python版本: Python 3.1.2

我对Python了解不多,但我会假设如果值是primitve类型,则它不会影响原始变量。否则,该值仅为将更改原始变量的参考值。

  • 在某些情况下,您将重新绑定其中一个名称,而不是另一个名称,因此它们现在绑定到不同的对象

    >>> 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'}
    
  • 在其他情况下,您正在对对象进行变异。然后两个名称都可以看到对象的更改

    y = 100      # Rebind y. Doesn't change x.
    y2 = 'world' # Rebind y2. Doesn't change x2.
    

当您写入
y=x
时,您不会更改变量的值。您正在将对象绑定到名称

在你的例子中

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.
>>> a = [1, 2]
>>> b = a
您有一个对象(列表),其中两个名称绑定到该对象。当然,当每个不同的名称访问同一对象时,该对象上的变化会反映出来

在你的例子中

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.
>>> a = [1, 2]
>>> b = a

游戏中有两个对象,值分别为
10
100
的整数。编写
y=100
时,只需将名称
y
重新绑定到另一个对象。名称<代码> x>代码>仍然绑定到<代码> 10 <代码> .< /p> 您应该考虑Python中的所有变量都是指向对象的指针。
x = 10
案例1 当你写作时

>>> x = 10
>>> y = x
>>> y = 100
y = 100
变量
x
是指向值为
10
的数字对象的指针

x = 10
变量
y
是指向当前由
x
指向的同一对象的指针

y = x
现在变量
y
指向另一个数值为
100
的数字对象。这显然对
x
所指向的对象没有影响

案例2 当你写作时

>>> x = 10
>>> y = x
>>> y = 100
y = 100
x
指向一个数组对象,该数组对象包含两个指针,用于对值为
1
2
的对象进行编号

x = [1, 2]
y
现在指向与
x

y = x

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

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


无法修改整型值和字符串值。列表和字典可以。编写类似于
b.append(3)
(其中
a
b
最初指的是一些列表值)的代码会导致使用名称
b
查找列表值,然后对其进行修改(调用其
.append
方法,从而导致更改)。由于
a
b
都引用相同的值,因此更改“由”
a
看到”。编写类似于
b=a+[3]
的代码将使用串联列表创建一个新值,并使
b
引用此新值而不是旧值。
a
引用的值不受影响,这与计算2+3=5时,2仍然与计算前相同。

此处的信息基本正确,但术语不标准。指针是一个不用于描述Python名称的术语。变量也不是。@DavidHeffernan:“名称”的概念并不涵盖所有用例(例如数组的槽或字典单元格的值部分)。我个人从来没有发现“名字标签”的解释真的有意义(但我是一个自下而上的人,可能这对自上而下的类型来说是有意义的)。你是在试图发现什么类型是可变的吗?什么类型是不可变的?您应该尝试查找“可变类型”,并阅读有关可变的
列表
dict
。整数、字符串(和元组)是不可变的。您没有尝试集合(可变)或冻结集合(不可变)。关于可变与不可变的文档非常清楚。如果您能参考文件中使您感到困惑的部分,这将对我们有所帮助。这其中哪一部分令人困惑?