python中赋值语句的特点和形式

 更新时间:2023年12月20日 09:11:35   作者:Python探索牛  
这篇文章主要介绍了python中赋值语句的特点和形式,文中介绍了多目标赋值的共享引用问题,多目标赋值其实是多个目标对同一个内存空间的引用,这里要分两种情况,当被引用对象是不可变对象时则不存在问题,感兴趣的朋友跟随小编一起看看吧

1. 赋值语句的特点

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

2. 赋值语句的形式

(1. 普通形式

>>> a = 'abc'          # 普通形式
>>> b = 123
>>> c = [1, 2, 3]

(2. 序列赋值

python中"="的右侧可以接受任意类型的序列,也可以是可迭代的对象,只要长度等于左侧序列即可。

>>> (a, b) = ('1', '2')   # 元组赋值,括号可省略
>>> [a, b] = ['1', '2']   # 列表赋值
>>> a, b, c, d = 'spam'   # 字符串序列赋值
# python中交换两个变量的值可以不用穿件第三个临时变量
>>> x, y = 1, 2
>>> x, y = y, x
>>> x, y
(2, 1)
# 当等号左侧与右侧变量长度不一致时,考虑用分片解决
>>> num = '123'
>>> a, b = num[:1], num[1:]
>>> a, b
('1', '23')
>>> num = '123'
>>> a, b = list(num[:1]) + [num[1:]]
>>> a, b
('1', '23')
# 嵌套赋值
>>> ((a, b), c) = ('12','3')
>>> a, b, c
('1', '2', '3')

3.扩展序列解包(*)

*X:序列赋值时,带有*的名称会被赋值一个列表,该列表收集序列中剩下的没被赋值给其他名称的所有项,可用于=左右两侧变量数目不同的情况。

>>> num = [1, 2, 3, 4]
>>> a, b = num   # 变量个数不同会报错
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: too many values to unpack (expected 2)  
>>> a, *b = num   # 扩展序列解包
>>> a, b
(1, [2, 3, 4])
>>> first, *mid, last = num  # 扩展序列解包的*可以出现在任何位置
>>> first, mid, last
(1, [2, 3], 4)

边界情况(特殊情况)(1. 带星号的名称值匹配到单个项,但仍然返回一个列表

>>> a = [1, 2, 3, 4]
>>> b, c, d, *e = a
>>> (b, c, d, e)
(1, 2, 3, [4])

(2. 若带星号的名称不能匹配到任何项,则返回一个空列表

>>> a = [1, 2, 3, 4]
>>> b, c, d, e, *f = a
>>> (b, c, d, e, f)
(1, 2, 3, 4, [])

(3. 若用了多个带星号的名称则会报错

>>> a = [1, 2, 3, 4]
>>> *b, c, *d = a
  File "<stdin>", line 1
SyntaxError: two starred expressions in assignment

(4. 带星号的名称没有被编写到一个列表中会报错

>>> a = [1, 2, 3, 4]
>>> *b = a
  File "<stdin>", line 1
SyntaxError: starred assignment target must be in a list or tuple
>>> *b, = a
>>> b
[1, 2, 3, 4]

4. 多目标赋值(连续赋值)

多目标赋值即将最右侧的对象依次赋值给左侧所有的名称。

>>> a = b = c = 0
>>> (a, b, c)
(0, 0, 0)

多目标赋值的共享引用问题

多目标赋值其实是多个目标对同一个内存空间的引用,这里要分两种情况,当被引用对象是不可变对象时则不存在问题;但是如果多目标都引用了同一个可变对象,则会出现问题

>>> a = b = 1
>>> (a, b)
(1, 1)
>>> b = 2
>>> (a, b)
(1, 2)
# a的值没有因为b的改变而改变
#学习中遇到问题没人解答?小编创建了一个Python学习交流群:711312441
>>> a = b = [1, 2]
>>> (a, b)
([1, 2], [1, 2])
>>> b[1] = 3
>>> (a, b)
([1, 3], [1, 3])
# a的值随着b值得改变而改变,即使没有主动给a赋值,这是因为a,b同时引用了一个可变对象,改变该对象则会通知改变a和b的值

到此这篇关于python中赋值语句教程的文章就介绍到这了,更多相关python赋值语句内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 探索Python int()函数传入中文或者字符串会发生什么

    探索Python int()函数传入中文或者字符串会发生什么

    这篇文章主要为大家介绍了Python int()函数传入中文或者字符串会发生什么,详细讨论int()函数的常规使用以及它如何处理异常输入,特别是涉及字符串和中文字符的情况
    2024-01-01
  • 详解Python进行数据相关性分析的三种方式

    详解Python进行数据相关性分析的三种方式

    相关系数量化数据集的变量或特征之间的关联。这些统计数据对科学和技术非常重要,Python 有很好的工具可以用来计算它们。SciPy、NumPy 和Pandas相关方法以及数据可视化功能,感兴趣的可以了解一下
    2022-04-04
  • python腾讯语音合成实现过程解析

    python腾讯语音合成实现过程解析

    这篇文章主要介绍了python腾讯语音合成实现过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-08-08
  • Python实现多条件筛选Excel数据并批量绘制直方图

    Python实现多条件筛选Excel数据并批量绘制直方图

    这篇文章主要为大家介绍了如何Python对Excel数据进行多条件筛选和去除并批量绘制直方图,文中的示例代码讲解详细,感兴趣的小伙伴可以参考一下
    2023-09-09
  • Python for循环中的陷阱详解

    Python for循环中的陷阱详解

    这篇文章主要给大家介绍了关于Python for循环中陷阱的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-07-07
  • python 无监督生成模型的示例

    python 无监督生成模型的示例

    无监督生成模型在机器学习中扮演着重要角色,特别是当我们在没有标签数据的情况下想要生成新的样本或理解数据的内在结构时,这篇文章主要介绍了python 无监督生成模型的示例,需要的朋友可以参考下
    2024-07-07
  • 深入了解Python 中线程和进程区别

    深入了解Python 中线程和进程区别

    这篇文章主要介绍了深入了解Python 中线程和进程区别,一个进程由一个或者多个线程组成,线程是一个进程中代码的不同执行路线。切换进程需要的资源比切换线程的要多的多,下面来了解更多的详细内容,需要的小伙伴可以参考一下
    2022-03-03
  • 使用Python通过oBIX协议访问Niagara数据的示例

    使用Python通过oBIX协议访问Niagara数据的示例

    这篇文章主要介绍了使用Python通过oBIX协议访问Niagara数据的示例,帮助大家更好的理解和学习python,感兴趣的朋友可以了解下
    2020-12-12
  • Python基础语法之容器详解

    Python基础语法之容器详解

    这篇文章主要介绍了Python基础语法之容器的相关资料,帮助大家更好的理解和学习python,感兴趣的朋友可以了解下,希望能够给你带来帮助
    2021-09-09
  • python代码检查工具pylint 让你的python更规范

    python代码检查工具pylint 让你的python更规范

    遇到一个新的问题,总是离不开3W原则(What,Why,hoW),下面是对python代码静态检测工具pylint的学习
    2012-09-09

最新评论