翼度科技»论坛 编程开发 python 查看内容

python中赋值语句教程

7

主题

7

帖子

21

积分

新手上路

Rank: 1

积分
21
1. 赋值语句的特点


  • 赋值语句创建对象的引用:赋值语句总是创建对象的引用,而不是复制对象。因此,Python中的变量更像是指针,而不是数据储存区域。
  • 变量在首次赋值时会被创建:因此不需要提前声明变量。
  • 变量在引用前必须先赋值:如果引用未赋值的变量会报错
2. 赋值语句的形式

(1. 普通形式
  1. >>> a = 'abc'          # 普通形式
  2. >>> b = 123
  3. >>> c = [1, 2, 3]
复制代码
(2. 序列赋值

python中"="的右侧可以接受任意类型的序列,也可以是可迭代的对象,只要长度等于左侧序列即可。
  1. >>> (a, b) = ('1', '2')   # 元组赋值,括号可省略
  2. >>> [a, b] = ['1', '2']   # 列表赋值
  3. >>> a, b, c, d = 'spam'   # 字符串序列赋值
  4. # python中交换两个变量的值可以不用穿件第三个临时变量
  5. >>> x, y = 1, 2
  6. >>> x, y = y, x
  7. >>> x, y
  8. (2, 1)
  9. # 当等号左侧与右侧变量长度不一致时,考虑用分片解决
  10. >>> num = '123'
  11. >>> a, b = num[:1], num[1:]
  12. >>> a, b
  13. ('1', '23')
  14. >>> num = '123'
  15. >>> a, b = list(num[:1]) + [num[1:]]
  16. >>> a, b
  17. ('1', '23')
  18. # 嵌套赋值
  19. >>> ((a, b), c) = ('12','3')
  20. >>> a, b, c
  21. ('1', '2', '3')
复制代码
3.扩展序列解包(*)

*X:序列赋值时,带有*的名称会被赋值一个列表,该列表收集序列中剩下的没被赋值给其他名称的所有项,可用于=左右两侧变量数目不同的情况。
  1. >>> num = [1, 2, 3, 4]
  2. >>> a, b = num   # 变量个数不同会报错
  3. Traceback (most recent call last):
  4.   File "<stdin>", line 1, in <module>
  5. ValueError: too many values to unpack (expected 2)  
  6. >>> a, *b = num   # 扩展序列解包
  7. >>> a, b
  8. (1, [2, 3, 4])
  9. >>> first, *mid, last = num  # 扩展序列解包的*可以出现在任何位置
  10. >>> first, mid, last
  11. (1, [2, 3], 4)
复制代码
边界情况(特殊情况)
(1. 带星号的名称值匹配到单个项,但仍然返回一个列表
  1. >>> a = [1, 2, 3, 4]
  2. >>> b, c, d, *e = a
  3. >>> (b, c, d, e)
  4. (1, 2, 3, [4])
复制代码
(2. 若带星号的名称不能匹配到任何项,则返回一个空列表
  1. >>> a = [1, 2, 3, 4]
  2. >>> b, c, d, e, *f = a
  3. >>> (b, c, d, e, f)
  4. (1, 2, 3, 4, [])
复制代码
(3. 若用了多个带星号的名称则会报错
  1. >>> a = [1, 2, 3, 4]
  2. >>> *b, c, *d = a
  3.   File "<stdin>", line 1
  4. SyntaxError: two starred expressions in assignment
复制代码
(4. 带星号的名称没有被编写到一个列表中会报错
  1. >>> a = [1, 2, 3, 4]
  2. >>> *b = a
  3.   File "<stdin>", line 1
  4. SyntaxError: starred assignment target must be in a list or tuple
  5. >>> *b, = a
  6. >>> b
  7. [1, 2, 3, 4]
复制代码
4. 多目标赋值(连续赋值)

多目标赋值即将最右侧的对象依次赋值给左侧所有的名称。
  1. >>> a = b = c = 0
  2. >>> (a, b, c)
  3. (0, 0, 0)
复制代码
多目标赋值的共享引用问题
多目标赋值其实是多个目标对同一个内存空间的引用,这里要分两种情况,当被引用对象是不可变对象时则不存在问题;但是如果多目标都引用了同一个可变对象,则会出现问题
  1. >>> a = b = 1
  2. >>> (a, b)
  3. (1, 1)
  4. >>> b = 2
  5. >>> (a, b)
  6. (1, 2)
  7. # a的值没有因为b的改变而改变
  8. #学习中遇到问题没人解答?小编创建了一个Python学习交流群:711312441
  9. >>> a = b = [1, 2]
  10. >>> (a, b)
  11. ([1, 2], [1, 2])
  12. >>> b[1] = 3
  13. >>> (a, b)
  14. ([1, 3], [1, 3])
  15. # a的值随着b值得改变而改变,即使没有主动给a赋值,这是因为a,b同时引用了一个可变对象,改变该对象则会通知改变a和b的值
复制代码
来源:https://www.cnblogs.com/djdjdj123/p/17914483.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!
来自手机

举报 回复 使用道具