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()