LeaCoder

关于Python-的“多元”赋值

2019-03-17
leacoder

引入:

实现链表翻转

class Solution:
    def reverseList(self, head: ListNode) -> ListNode:
        cur = head
        prev = None
        while cur:
            cur.next,prev,cur = prev,cur,cur.next
        return prev

初入Python时,常按着C++的思维去想,然后被如下赋值给搞懵逼了。

 cur.next,prev,cur = prev,cur,cur.next

那为什么这样赋值能产生我们需要的效果?我们来简单了解下Python的变量赋值

变量赋值

###赋值运算符 Python 语言中, 等号(=)是主要的赋值运算符。

anInt = 11

aString = ‘leacoder’

aFloat = -3.1415

aList = [“a”, “b”, “c”, “d”];

当然还有其他基本数据类型 可以参见 Python3 基本数据类型

注意,赋值并不是直接将一个值赋给一个变量,尽管可能根据其它语言编程经验认为应

该如此(比如我T_T)。在 Python 语言中,对象是通过引用传递的。在赋值时,不管这个对象是新创建的,还是一个已经存在的,都是将该对象的引用(并不是值)赋值给变量。

多重赋值

x=y=z=0

一个值为 0 的整数对象被创建,该对象的同一个引用被赋值给 x、y 和z 。也就是将一个对象赋给了多个变量。当然,在 Python 当中,将多个对象赋给多个变量也是可以的。

###“多元”赋值 另一种将多个变量同时赋值的方法我们称为多元赋值(multuple)。将 “mul-tuple”连在一起自造的。因为采用这种方式赋值时, 等号两边的对象都是元组。

x, y, z = 1, 2, 'a string'
等同于 (x, y, z) = (1, 2, 'a string')

两个整数对象(值分别为 1 和 2)及一个字符串对象, 被分别赋值给x, y 和 z。通常元组需要用圆括号(小括号)括起来,尽管它们是可选的。但是加上圆括号以使得代码有更高的可读性,当然误解也就更少了。

在其他语言中(如C++),要交换两个值, 会想到使用一个临时变量比如 tmp 来临时保存其中一个值:

tmp = x;
x = y;
y = tmp;

在上面的 代码片段中,变量 x 和变量 y 的值被互相交换.临时变量 tmp 用于在将 y 赋值给 x 前先保存 x 的值。将 y 的值赋给 x 之后, 才可以将保存在 tmp 变量中的 x 的值赋给 y。

Python 的多元赋值方式可以实现无需中间变量交换两个变量的值。

x, y = 123, 'a string'
print(x,y)
x, y = y, x
print(x,y)

输出:123.png

Python 在赋值之前已经事先对 x 和 y 的新值做了计算。

列表和元组

可以将列表和元组当成普通的“数组”,它能保存任意数量任意类型的 Python 对象。和数组一样,通过从 0 开始的数字索引访问元素,但是列表和元组可以存储不同类型的对象。

列表和元组有几处重要的区别:

列表:元素用中括号( [ ])包裹,元素的个数及元素的值可以改变

元组:元素用小括号(( ))包裹,不可以更改(尽管他们的内容可以)。元组可以看成是只读的列表。


GitHub链接: https://github.com/lichangke/LeetCode

知乎个人首页: https://www.zhihu.com/people/lichangke/

简书个人首页: https://www.jianshu.com/u/3e95c7555dc7

个人Blog: https://lichangke.github.io/

欢迎大家来一起交流学习


Comments

Content