Python变量赋值混乱

Python变量赋值混乱,python,Python,为什么我会这样做: x = y = {} 每次我修改x,比如x[1]=5,我也会修改y,反之亦然?如果将名称x和y指定为指向同一个词典,您会期望出现什么样的行为 如果希望它们指向不同的词典,请使用 x = {} y = {} 或 这就是引用的工作原理。对于x=y={},有两个引用变量,但它们都指向同一个对象。使用x[1]=5,您实际上并不是在修改x本身,而是修改x引用的对象。这与y引用的对象相同,除非您将x和/或y设置为引用新对象 另见 因为x和y引用同一个字典 引擎盖下发生了什么: -

为什么我会这样做:

x = y = {}

每次我修改x,比如
x[1]=5
,我也会修改y,反之亦然?

如果将名称
x
y
指定为指向同一个词典,您会期望出现什么样的行为

如果希望它们指向不同的词典,请使用

x = {}
y = {}


这就是引用的工作原理。对于
x=y={}
,有两个引用变量,但它们都指向同一个对象。使用
x[1]=5
,您实际上并不是在修改
x
本身,而是修改
x
引用的对象。这与
y
引用的对象相同,除非您将
x
和/或
y
设置为引用新对象

另见

    • 因为x和y引用同一个字典

      引擎盖下发生了什么:

      -----   ------- 
      | x | = | ref |----- 
      -----   -------    |
                         v
                       ------
                       | {} |
                       ------
                         ^
      -----   -------    |
      | y | = | ref |-----
      -----   ------- 
      
      了解可变和不可变数据:


      正如其他答案所说,最初的问题发生是因为您分配了一个引用。下一个混乱级别是当您执行以下操作时:

      a = [[1]]
      b = a[:] # You might think [:] will protect you from the original gotcha.
      a[0][0] = 2
      print b[0][0] # It's 2...why did this change?
      
      它发生了更改,因为a[:]片实际上正在复制对[0]的引用。换句话说,即使a和b引用不同的列表,因为您使用了[:],但每个元素中的第一个元素都引用相同的列表。这是一个新形式的原始问题。正确的方法是

      import copy
      a = [[1]]
      b = copy.deepcopy(a)
      a[0][0] = 2
      print b[0][0] # 1
      

      Python上的变量不像“盒子”(放置对象的地方),而是像“标签”(为对象指定名称的地方)

      所以当你这样做的时候:

      x = y = {}
      
      你真的在对Python说:

      我想把{}称为x和y

      理解这一点的另一种方法是,{}语法只是dict()的快捷方式,它只返回一个新的dict对象。因此,另一种方式是:

      x = y = dict()
      

      这只返回一个dict对象,并为其指定两个名称(x和y)。

      提示:您期望“按值赋值”,但实际发生的是“按引用赋值”。@Agos:有时,反问句是一个恰当的答案。
      x = y = dict()