前言
Python 的链式赋值是一种简易型批量赋值语句,一行代码即可为多个变量同时进行赋值。
例如:
x=y = z = 1
链式赋值是一种非常优雅的赋值方式,简单、高效且实用。但同时它也是一个危险的糖衣炸弹,值得我们引起关注。
面试题:求链式赋值语句中变量 x 的值?
x = [1, 2, 3, 4, 5]
i = 0
i = x[i] = 3
如果你有过 C 语言的编程经验,那么你的思维习惯可能会让你得出这样的结果:x[0] 被赋值为 3,然后 i 再被赋值为 3,所以变量 x 的值为 [3, 2, 3, 4, 5]。
但实际上正确的答案却是:变量 i 首先被赋值为 3,然后 x[3] 再被赋值为3,所以最终变量 x 的值为 [1, 2, 3, 3, 5]。
从上述结果的表现可以看出二者的区别为:C 语言的赋值顺序是自右往左* 依次进行的,而 Python 则相反。*
造成这种表征区别的本质原因是由于 C 语言是一种「值语义」类型语言,而 Python 是「对象语义」类型语言。
值语义类型编程语言
值语义指使用系统标准的拷贝方式将一个源对象拷贝成为目标对象后,源对象与目标对象之间毫无关系,彼此独立存在,改变互不影响。
从这一特性出发, C 语言的赋值语句被设计成了具有返回值的表达式,如此才能够保证在链式赋值中所有的对象最终都是彼此独立的。
例如:
x=(y = 1)
表达式 y = 1 在将数值