概 述:赋值语句是编程世界里最常见的语句。在Python中,拥有一些其他语言不具有的赋值技巧。
1 赋值的基本形式
Python语句赋值的基本形式是:
在等号的左边写赋值语句的目标;在等式的右边写要赋值的对象。左侧的目标可以是变量名或对象元素,而右侧的对象可以是任何会计算得到的对象的表达式。需要注意:
- 赋值语句建立对象的引用值。Python赋值语句会把对象的引用值存储在变量名或数据结构的元素内。
- 变量名在首次赋值时会被创建。
- 变量名在引用前必须先赋值
- 隐式赋值语句:import、from、def、class、for、函数参数。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | >>> # 基本赋值 ... name = ['hinata','Naruto','XLX'] >>> name ['hinata', 'Naruto', 'XLX'] >>> # (1) 赋值语句建立对象的引用值。 ... name2 = name >>> name[0] = 'nici' >>> name ['nici', 'Naruto', 'XLX'] >>> name2 ['nici', 'Naruto', 'XLX'] >>> # 变量名在首次赋值时会被创建。 ... # 变量名在引用前必须先赋值 ... name = name3 Traceback (most recent call last): File "<stdin>", line 3, in <module> NameError: name 'name3' is not defined |
说明:
- 赋值语句建立对象的引用值。 上述代码中,修改了name,name2的值随之改变。
- 变量名在引用前必须先赋值。 上述代码中,name3没被赋值就被引用,所以报”not defined”错误。
2 序列赋值
序列赋值可以多个赋值操作同时进行,也可以交换或者多个变量的值。
1 2 3 4 5 6 | >>> x,y,z = 1,2,3 >>> print x,y,z 1 2 3 >>> x,y = y,x >>> print x,y,z 2 1 3 |
上述的做法实际上是叫做序列解包或者递归解包。形象表示如下;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | >>> values = 1,2,3 >>> values (1, 2, 3) >>> x,y,z = values >>> print x,y,z 1 2 3 >>> a,b,c = 'ABC' >>> print a,b,c A B C >>> scoundrel = {'name':'hinata','age':16} >>> key,value = scoundrel.popitem() >>> key 'age' >>> value 16 |
注意:
所解包的序列中的元素数量必须和放置在赋值符号=左边的变量数量完全一致,否则python会在赋值时引发异常。
1 2 3 4 5 6 7 8 | >>> x,y = (1,2,3) Traceback (most recent call last): File "<stdin>", line 1, in <module> ValueError: too many values to unpack >>> x,y,z = 1,2 Traceback (most recent call last): File "<stdin>", line 1, in <module> ValueError: need more than 2 values to unpack |
3 链式赋值
链式赋值是将同一值赋值给多个变量的途径。
1 2 3 4 5 6 | >>> a=b=1 >>> a,b (1, 1) >>> b = b + 1 >>> a,b (1, 2) |
注意,若变量a和变量b是引用变量时,需要额外小心。
1 2 3 4 5 6 | >>> a=b=[] >>> a,b ([], []) >>> a.append('Hinata') >>> a,b (['Hinata'], ['Hinata']) |
这时,我们需要单独赋值。
1 2 3 4 5 | >>> a = [] >>> b = [] >>> a.append('Hinata') >>> a,b (['Hinata'], []) |
4 增量赋值
将 X = X + Y 写成 X += Y 的形式,就是增量赋值。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | >>> X = 1 >>> Y = 2 >>> X += Y >>> X 3 >>> X &= Y >>> X 2 >>> X //= Y >>> X 1 >>> X **= Y >>> X 1 |
增强赋值语句的优点
- 左侧只需计算一次。 在 X += Y中,X出现一次,则只需计算一次。而在完整形式X = X + Y 中,X出现两次,则必须执行两次。因此,增强赋值语句通常执行得更快。
- 优化技术会自动选择。对于支持原处修改的对象而言,增强形式会自动执行原处的修改运算,而不是相比来说速度更慢的复制。
注意:对于’+=’,通常隐含的意思是:对列表是做原处修改的意思。其完全不像’+’合并,总是生成新的对象。如下面代码所示:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | >>> L = [1,2] >>> M = L >>> L = L + [3,4] >>> L,M ([1, 2, 3, 4], [1, 2]) >>> >>> L = [1,2] >>> M = L >>> L += [3,4] >>> L,M ([1, 2, 3, 4], [1, 2, 3, 4]) >>> >>> L = [1,2] >>> M = L >>> L.append(3) >>> L,M ([1, 2, 3], [1, 2, 3]) >>> >>> >>> L = [1,2] >>> M = L >>> L.extend([3,4]) >>> L,M ([1, 2, 3, 4], [1, 2, 3, 4]) |
注意:由于字符串是不可变类型,所以’+=’对于字符串没有上述的效果。
1 2 3 4 5 6 7 8 9 10 11 12 | >>> L = 'I' >>> M = L >>> L = L + ' Love' >>> L,M ('I Love', 'I') >>> >>> >>> L = 'I Love' >>> M = L >>> L += ' YOU' >>> L,M ('I Love YOU', 'I Love') |