• 两行python代码,你是否可猜到运行结果


    两行python代码,你是否可猜到运行结果

    参考: http://www.cnblogs.com/way_testlife/archive/2011/07/20/2111549.html#2156893

    代码如下

    #!/usr/bin/env python
    #-*- encoding: utf-8 -*-
    
    def func(a, b=[]):
        b.append(a)
        print b
    
    ''' 运行结果如下:
    [1]
    [1, 2]
    [1, 2, 3]
    [1, 2, 3, 4]
    ['hello', 'world', 5]
    原因:b列表没有释放,默认参数b保留了前面调用所进行的修改。
    '''
    func(1)
    func(2)
    func(3)
    func(4)
    l = ['hello', 'world']
    func(5, l)
    
    '''运行结果如下:
    will.change
    {'Name': 'Allen'}
    will.change
    {'Hobby': 'basketball'}
    
    原因分析:
    这里有一个变量名解析的原则:LEGB。即当引用一个变量时,
    Python 按以下顺序依次进行查找,
    从本地变量中,在任意上层函数的作用域,在全局作用域,最后在内置作用域中查找。
    本地变量 < 任意上层函数的作用域 < 全局变量 < 内置作用域
    第一个完成查找的就算成功。变量在代码中被赋值的位置通常就决定了它的作用域。
    
    函数TT中的Name就是函数T的参数1,
    而(Name=2)是作为字典传给kwargs的,用Name做字典的key很有迷惑性啊。其实(Name=2)中的Name和(print Name)中的Name完全两回事。
    '''
    def T(Name):
        def TT(**kwargs):
            print Name
            print kwargs
        return TT
    
    T('will.change')(Name = 'Allen')
    T('will.change')(Hobby = 'basketball')
    

    运行如下

    [1]
    [1, 2]
    [1, 2, 3]
    [1, 2, 3, 4]
    ['hello', 'world', 5]
    will.change
    {'Name': 'Allen'}
    will.change
    {'Hobby': 'basketball'}
    

    原因分析

    见程序中的注释

  • 相关阅读:
    统计学——平均数
    JSON与JAVA的数据转换
    Linux使用笔记
    vim代码折叠命令
    让ubuntu的ssh保持长时间连接
    Ubuntu通过xinput禁用及启用联想笔记本的触摸板
    linux下Oracle 相关命令
    linux机械磁盘服务器分区方案
    centos 6.5搭建LNMP环境
    centos6.5下搭建oracle 11g
  • 原文地址:https://www.cnblogs.com/ZhangRuoXu/p/6706468.html
Copyright © 2020-2023  润新知