Python3 的变量

作者: 运维开发_西瓜甜 | 来源:发表于2018-11-15 22:48 被阅读215次

    变量是什么

    在 python 中究竟该如何正确理解变量的赋值过程呢?

    s = 'hello'
    

    以上的变量赋值,应该说成把变量分配给对象更合理。

    hello 这个字符串对象会在内存中先被创建,之后再把变量 s 分配给这个对象。

    image.png

    所以要理解 Python 中的变量赋值,应该始终先看**等号右边**

    **对象在右边先被创建或者被获取**,在此之后左边的变量才会绑定到对象上,这就像为对象贴上了标签。

    **变量是对象的标签或者说是对象的别名,当然一个对象可以有多个标签或者别名**

    如下:

    a = 1
    b = a
    a = 2
    print(b)  # b 会是 ?
    

    a = 1 时如下图:

    image.png

    b = a 时如下图:

    image.png

    a = 2 时如下图:

    image.png

    上面的 b = a 我们称它为 传递引用,此时对象会拥有两个名称(标签) ,分别是 ab


    变量赋值

    在 Python3 中你可以这样给变量赋值

    In [2]: x, y, z = 1, 2, 3
    
    In [3]: x
    Out[3]: 1
    
    In [4]: y
    Out[4]: 2
    
    In [5]: z
    Out[5]: 3
    

    当然也可以这样

    In [10]: a, b, c = 'abc'
    
    In [11]: a
    Out[11]: 'a'
    
    In [12]: b
    Out[12]: 'b'
    
    In [13]: c
    Out[13]: 'c'
    

    这种赋值方式可以称为元组解包,你若是喜欢,叫它多元赋值也行。

    元组解包其实适用于所有的序列类型(可迭代对象)的数据: 字符串、列表、元组等

    假如你需要对一个序列类型中的数据进行一一解开赋值,那就需要等号左边的变量名和序列类型数据中的元素个数相同。

    当然也可以只要其中的一个,或者一部分,像下面的几种情况:

    1. 只要要其中的一部分
    有时候,你可能只想解压一部分,丢弃其他的值。对于这种情况 Python 并没有提供特殊的语法。 但是你可以使用任意变量名去占位,到时候丢掉这些变量就行了。

    In [22]: data = [ 'ACME', 50, 91.1, (2012, 12, 21) ]
    
    In [23]: _, shares, price, _ = data
    
    In [24]: shares
    Out[24]: 50
    
    In [25]: price
    Out[25]: 91.1
    

    在这里必须保证你选用的那些占位变量名在其他地方没被使用到。
    这里采用了英文的短下划线 _ 作为临时变量名。
    这样懂行的人看到这个,就会知道在之后的代码中将不会再次用到此变量。

    2. 只要第一个

    In [14]: s, *_ = ['shark', 18, 100]
    
    In [15]: s
    Out[15]: 'shark'
    

    * 是 python3 中的一个表达式,他可以把没有明确指出元素搜集起来。
    可以称它为 星号解压语法

    3. 只要最后一个

    In [16]: *_, score = ['shark', 18, 100]
    
    In [17]: score
    Out[17]: 100
    

    4. 要第一个,其他的都放到列表中

    In [19]: name, *info = ['shark', 18, 100]
    
    In [20]: name
    Out[20]: 'shark'
    
    In [21]: info
    Out[21]: [18, 100]
    

    值得注意的是上面解压出的 info 变量永远都是列表类型,不管解压的数字的数量是多少(包括 0 个)
    你可以试着把等号左边的两个调换一下位置^_^

    5. 嵌套的也好使

    In [28]: record = ('xiguatian', 50, 123.45, (12, 18, 2012))
    
    In [29]: name, *_, (*_, year) = record
    
    In [30]: name
    Out[30]: 'xiguatian'
    
    In [31]: year
    Out[31]: 2012
    

    6. 用于 字符串的分割

    In [35]: line = 'nobody:x:99:99:Nobody:/:/sbin/nologin'
    
    In [36]: name, * fields, sh = line.split(":")
    
    In [37]: name
    Out[37]: 'nobody'
    
    In [38]: sh
    Out[38]: '/sbin/nologin'
    

    7. 解压迭代元素为可变长元组的序列

    records = [
        ('foo', 1, 2),
        ('bar', 'hello'),
        ('foo', 3, 4),
    ]
    
    def do_foo(x, y):
        print('foo', x, y)
    
    def do_bar(s):
        print('bar', s)
    
    for tag, *args in records:
        if tag == 'foo':
            do_foo(*args)
        elif tag == 'bar':
            do_bar(*args)
    

    执行结果:

    foo 1 2
    bar hello
    foo 3 4
    

    今儿就到这儿吧^_^
    有任何问题加我微信: y86000153

    相关文章

      网友评论

        本文标题:Python3 的变量

        本文链接:https://www.haomeiwen.com/subject/ietufqtx.html