缺省值及属性(Python)

引用类型的缺省值

def bar(x=[]):  # 这里缺省值是引用类型,它每次调用时的地址一样
    x.append(1) # 当在缺省值中添加一个元素时它的内存地址不变
    print(x)


bar()  # [1]
bar()  # [1, 1]
bar()   #[1, 1, 1]

defaults

  1. 因为函数也是对象,每个函数被定义后,就生成了一个函数对象和这个函数名,这个标识符关联
  2. pthon把函数的默认值放在了函数对象的属性中,这个属性伴随着这个函数对象的整个生命周期
  3. 查看 函数名.defaults 属性,它是一个元组
def foo(xyz = [], m = 123, n = "abc"):
    xyz.append(1)
    print(xyz)
print(id(foo), foo.__defaults__)
foo()
print(id(foo), foo.__defaults__)
foo()
print(id(foo), foo.__defaults__)

结果:

1885728856816 ([], 123, 'abc')
[1]
1885728856816 ([1], 123, 'abc')
[1, 1]
1885728856816 ([1, 1], 123, 'abc')

  1. 函数地址并没有变, 就是说foo这个函数对象没有变过, 它的属性__defaults__中使用元组保存默认值 xyz默认值是引用类型, 引用类型的元素变动, 并不是元组的变化
  2. 注意:属性__defaults__中使用元组保存所有位置参数默认值, 它不会因为在函数体内改变了局部变量(形参)的值而发生改变
  3. 属性 __kwdafaults__中使用字典保存所有keyword-only参数的默认值
  4. 注意!!!!!!
    1.a += [4] 相当于 a.extend([4])
    2.a = a+ [4] 相当于生成一个新变量

你可能感兴趣的:(笔记,python)