Python变量赋值后修改原变量,为何y的取值存在差异?
Python变量赋值后修改的结果判断方法
你遇到的问题核心是Python中可变类型与不可变类型的区别,以及变量的底层逻辑——Python里的变量本质是指向内存对象的引用,而非直接存储数据。
关键概念区分
不可变类型(Immutable)
这类对象一旦创建就无法原地修改,若要改变值,必须生成新对象并让变量指向它:
- 包含类型:整数(int)、字符串(str)、浮点数(float)、元组(tuple)、布尔值(bool)
可变类型(Mutable)
这类对象创建后可直接在原内存地址上修改内容,无需生成新对象:
- 包含类型:列表(list)、字典(dict)、集合(set)
案例逻辑拆解
案例1(整数,不可变)
x = 0 y = x # y和x指向内存中同一个整数对象0 x = 1 # 整数不可变,此处创建新对象1,x转而指向它,y仍指向原对象0 print(y) # 输出0
案例2(列表,可变)
x = [0] y = x # y和x指向同一个列表对象 x[0] = 1 # 直接在原列表上修改元素,未生成新对象,y指向的仍是该列表 print(y) # 输出[1]
案例3(字典,可变)
x = {'key':0} y = x # y和x指向同一个字典对象 x['key'] = 1 # 原地修改字典的value,原对象未变,y能看到修改结果 print(y) # 输出{'key': 1}
案例4(集合,可变)
x = set() y = x # y和x指向同一个集合对象 x.add(1) # 原地给集合添加元素,原对象未变,y能看到修改结果 print(y) # 输出{1}
案例5(字符串,不可变)
x = '0' y = x # y和x指向同一个字符串对象'0' x += '1' # 字符串不可变,此处生成新字符串'01',x转而指向它,y仍指向原对象'0' print(y) # 输出'0'
快速判断y取值的方法
- 先确定原始数据D的类型是可变还是不可变
- 观察修改x的方式:
- 若为重新赋值(如
x = 1、字符串的x += '1'):- 无论类型,y都会保留原始值D(因为x指向了新对象,y仍指向原对象)
- 若为原地修改(如
x[0]=1、x['key']=1、x.add(1)):- 仅可变类型支持此操作,此时y会取修改后的值D'(因为x和y指向同一个对象,对象本身已被修改)
- 若为重新赋值(如
内容的提问来源于stack exchange,提问作者Jonathan Rubin
相关产品推荐
相关产品推荐

