欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

pyhton链式赋值在可变类型/不可变类型上的区别以及其本质

程序员文章站 2023-11-13 11:57:46
关于链式赋值的一些注意点: a=[]b=[]x=y=[]print(a==b) #Trueprint(x==y) #Trueprint(a is b) #Falseprint(x is y) #Truea.append(1)x.append(666)print(a,b,x,y)输出结果为:[1] [ ......

关于链式赋值的一些注意点:

a=[]
b=[]
x=y=[]
print(a==b) #true
print(x==y) #true
print(a is b) #false
print(x is y) #true
a.append(1)
x.append(666)
print(a,b,x,y)
输出结果为:
[1] [] [666] [666]

aa=1
bb=1
cc=dd=1
print(aa==bb) #true
print(cc==dd) #true
print(aa is bb) #true
print(cc is dd) #true

总结:对于不可变类型,不存在修改的问题,所以可以多个值指向同一个id,
如x=y=10,如果想修改成x等于20,只能通过重新赋值的方法,如x=20,此时
x所指向的id路径发生变更,并不是在原id上进行修改,所以不会影响到y的路径和
y所对应的id
而对于可变类型,由于存在增删修改的问题,所以如果不是重新赋值,则都是在原id处进行修改,
若存在多个值指向此处id,则这些值的输出结果都会发生不改变。

 

 

另一个:
s = [1, 2, 3, 4, 5, 6]
i = 0
i = s[i] = 3
print(i)
print(s)
输出结果:
3
[1, 2, 3, 3, 5, 6]
先说结论:
python 的链式赋值顺序是 自左往右 。
原理:
python是一门对象语义类型编程语言。
对象语义,也称为引用语义,指使用系统标准的拷贝方式将一个源对象拷贝成为目标对象后,
源对象与目标对象之间依然共享底层资源,对任意一方的改变都将影响到另一方。

由于不需要像 c 语言那般要求对象之间的独立性,
所以,python 的赋值语句就仅仅是一条语句,而非表达式,也就不存在返回值。
在 python 的定义中,表达式是由操作符(operator)连接而成的语句,
但等号 = 并不属于 python 的操作符,而是分隔符(delimiters)。
所以下列语句在 python 中是非法的。

x = (y = 1) #会报错

因为 y = 1 并没有返回值,所以最后执行的是将 “没有返回值” 赋值给了变量 x,
显然这样的语义是不存在意义的。