zoukankan      html  css  js  c++  java
  • python中使用list作为默认参数且调用时不给其赋值的问题

    最近在写代码时发现一个有趣的地方,当python中的函数使用list作为默认参数且调用时不给其赋值时,无法通过在函数中将其赋值为[]来达到清空此默认参数的目的。按照道理来说,函数f1中的list为局部变量,在下次进入时,其应保持默认值才对。而且list具有可变性,在原内存地址中修改其内容。

    具体代码如下:

    def f1(a=[2]):
        a.append(100)
        print a
        a=[]
        #del a[:]
        print a
    
    def f2(a=[2]):
        a.append(100)
        print a
        #a=[]
        del a[:]
        print a
    
    def f3(b):
        b.append(100)
        print b
        b=[]
        print b
    
    print 'f1 result:'
    for i in range(2):
        f1()
        
    print 'f1 result when give parameter:'
    for i in range(3):
        c=[9]
        f1(c)
        
    print 'f2 result:'
    for i in range(4):
        f2()
        
    print 'f3 result:'
    for i in range(5):
        d=[8]
        f3(d)
    

    运行结果如下:

    f1 result:
    [2, 100]
    []
    [2, 100, 100]
    []
    f1 result when give parameter:
    [9, 100]
    []
    [9, 100]
    []
    [9, 100]
    []
    f2 result:
    [2, 100]
    []
    [100]
    []
    [100]
    []
    [100]
    []
    f3 result:
    [8, 100]
    []
    [8, 100]
    []
    [8, 100]
    []
    [8, 100]
    []
    [8, 100]
    []
    

     自己想了个可能的答案。(当python中的函数使用list作为默认参数且调用时不给其赋值时)在f1()中,list a在内存空间中指向[2]。执行a.append(100)后,list a指向的内存空间不变,内容变为[2,100]。执行a=[]后,list a指向的空间变了,其内容为[]。当再次进入f1()时,list a又指向了原来的内容空间,即内容为[2,100]。所以,当执行a.append(100)后,list a指向的内存空间不变,内容变为[2,100,100]。为了验证我的猜想,修改了下代码:

    def f1(a=[2]):
        a.append(100)
        print a,
        print id(a)
        a=[]
        #del a[:]
        print a,
        print id(a)
    
    def f2(a=[2]):
        a.append(100)
        print a,
        print id(a)
        #a=[]
        del a[:]
        print a,
        print id(a)
    
    def f3(b):
        b.append(100)
        print b,
        print id(b)
        b=[]
        print b,
        print id(b)
    
    print 'f1 result:'
    for i in range(2):
        f1()
        
    print 'f1 result when give parameter:'
    for i in range(3):
        c=[9]
        f1(c)
        
    print 'f2 result:'
    for i in range(4):
        f2()
        
    print 'f3 result:'
    for i in range(5):
        d=[8]
        f3(d)

    结果为:

    f1 result:
    [2, 100] 12299240
    [] 12338960  #the address is different
    [2, 100, 100] 12299240
    [] 12338960
    f1 result when give parameter:
    [9, 100] 12338960
    [] 12339040
    [9, 100] 12339040
    [] 12338960
    [9, 100] 12338960
    [] 12339040
    f2 result:
    [2, 100] 12299320
    [] 12299320  #the address is the same
    [100] 12299320
    [] 12299320
    [100] 12299320
    [] 12299320
    [100] 12299320
    [] 12299320
    f3 result:
    [8, 100] 12339040
    [] 12337280
    [8, 100] 12337280
    [] 12339040
    [8, 100] 12339040
    [] 12337280
    [8, 100] 12337280
    [] 12339040
    [8, 100] 12339040
    [] 12337280
    

      

  • 相关阅读:
    C++ generic tools -- from C++ Standard Library
    18 12 18 给服务器添加logging 日志功能
    18 12 14 python提高 装饰器
    18 12 `12 WSGI 协议
    18 12 07 MySQL 与python 的交互
    转 SQL 的数据库 架构规范 之 58到家数据库30条军规解读
    18 12 06 sql 的 基本语句 查询 条件查询 逻辑运算符 模糊查询 范围查询 排序 聚合函数 分组 分页 连接查询 自关联 子查询
    18 12 4 SQL 的基本 语法
    clion 的 安装 变量配置的 搬运工(有点基础应该能看 大家看不懂 就是我自己看 哈哈哈哈哈哈)
    18 11 27 高级的服务器连接 epoll
  • 原文地址:https://www.cnblogs.com/sunada2005/p/3190036.html
Copyright © 2011-2022 走看看