zoukankan      html  css  js  c++  java
  • 两行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'}
    

    原因分析

    见程序中的注释

  • 相关阅读:
    接口性能测试方案
    如何选择自动化测试框架
    一维和二维前缀和
    高精度 加减乘除
    归并排序 快速排序
    链表
    二分查找
    表达式求值
    c++ const问题小记
    虚继承总结
  • 原文地址:https://www.cnblogs.com/ZhangRuoXu/p/6706468.html
Copyright © 2011-2022 走看看