zoukankan      html  css  js  c++  java
  • pyhton链式赋值在可变类型/不可变类型上的区别以及其本质

    关于链式赋值的一些注意点:

    a=[]
    b=[]
    x=y=[]
    print(a==b) #True
    print(x==y) #True
    print(a is b) #False
    print(x is y) #True
    a.append(1)
    x.append(666)
    print(a,b,x,y)
    输出结果为:
    [1] [] [666] [666]

    aa=1
    bb=1
    cc=dd=1
    print(aa==bb) #True
    print(cc==dd) #True
    print(aa is bb) #True
    print(cc is dd) #True

    总结:对于不可变类型,不存在修改的问题,所以可以多个值指向同一个ID,
    如x=y=10,如果想修改成x等于20,只能通过重新赋值的方法,如x=20,此时
    x所指向的ID路径发生变更,并不是在原ID上进行修改,所以不会影响到y的路径和
    y所对应的id
    而对于可变类型,由于存在增删修改的问题,所以如果不是重新赋值,则都是在原id处进行修改,
    若存在多个值指向此处id,则这些值的输出结果都会发生不改变。

    另一个:
    s = [1, 2, 3, 4, 5, 6]
    i = 0
    i = s[i] = 3
    print(i)
    print(s)
    输出结果:
    3
    [1, 2, 3, 3, 5, 6]
    先说结论:
    Python 的链式赋值顺序是 自左往右 。
    原理:
    python是一门对象语义类型编程语言。
    对象语义,也称为引用语义,指使用系统标准的拷贝方式将一个源对象拷贝成为目标对象后,
    源对象与目标对象之间依然共享底层资源,对任意一方的改变都将影响到另一方。

    由于不需要像 C 语言那般要求对象之间的独立性,
    所以,Python 的赋值语句就仅仅是一条语句,而非表达式,也就不存在返回值。
    在 Python 的定义中,表达式是由操作符(Operator)连接而成的语句,
    但等号 = 并不属于 Python 的操作符,而是分隔符(Delimiters)。
    所以下列语句在 Python 中是非法的。

    x = (y = 1) #会报错

    因为 y = 1 并没有返回值,所以最后执行的是将 “没有返回值” 赋值给了变量 x,
    显然这样的语义是不存在意义的。

  • 相关阅读:
    web----DNS解析
    iToken----开发前准备
    web----计算机网络通讯
    SpringCloud----基础
    微服务----理解
    微服务----docker-compose.yml属性详解
    微服务----一次构建,到处运行
    Linux----安装gcc
    微服务----Registry
    Linux----常用命令
  • 原文地址:https://www.cnblogs.com/realadmin/p/10011312.html
Copyright © 2011-2022 走看看