美文网首页
python 函数 / 类的传参问题

python 函数 / 类的传参问题

作者: 大王叫我来巡老和山 | 来源:发表于2019-01-14 14:15 被阅读0次

今天遇到了一个没想通的问题,先记录下来。

python 函数:三种类型的参数传递方式


函数传参


def add_bar(items=[]):
    # print(items)
    items.append('bar')
    return items

a = add_bar([])
print('a:',a)    
b = add_bar([])
print('a:',a,'\t b:',b)      
print('b:',b,'\t f:',add_bar()) 
print(id(a),id(b))

# return 
# a: ['bar']
# a: ['bar']     b: ['bar']
# b: ['bar']     f: ['bar']
# 1112207291464 112207598152

如上所示,是没有任何问题的。但是当我把代码改成下面形式时(我所做的只是去掉传递的参数,空列表 '[]' ),便会出现不可思议的事情:

def add_bar(items=[]):
    # print(items)
    items.append('bar')
    return items

a = add_bar()
print('a:',a)                   
b = add_bar()
print('a:',a,'\t b:',b)         
print('b:',b,'\t f:',add_bar()) 
print(id(a),id(b))

# return
# a: ['bar']
# a: ['bar', 'bar']      b: ['bar', 'bar']
# b: ['bar', 'bar', 'bar']   f: ['bar', 'bar', 'bar']
# 112025071816 112025071816

当我没有传递参数时,可以看到 id(a) 是等于 id(b) 的。这表明默认参数已经修改了,不再是 '[]'。我看到有的文章给出建议,说当参数使用字典、集合和列表时,在默认参数位置填‘None',而不是 ’[]' 或者 '{}' 等。

  有些时候列表和元组可以互换使用,因此人们经常会在代码中随机使用两者之一。于是当你试图修改一个元组(比如给其中一个元素赋值)时就会出错。或者试图用列表作为字典的键,也会导致 TypeError,因为列表是可修改的。元组和字符串可以作为字典的键使用,因为它们不可修改,可以得到确定的哈希值,而其他数据结构都不行,因为它们的对象标识即使保持不变,值也会改变。
  函数设置参数时,在默认参数的位置使用元组或 None(代替空字典或空列表),并且在缺乏足够的防御代码的情况下,避免将可修改的数据结构在不同的上下文中传递
              ——— 在 Python 中使用函数式编程的最佳实践

类参数


如下所示定义参数的话,则会出现一个类下面的多个实例,共用同一个参数的问题(bus1 和 bus2 的 passeners 相同):

class Bus(object):
    passengers = set()
    def add_passenger(self, person):
        self.passengers.add(person)

bus1 = Bus()
bus2 = Bus()
bus1.add_passenger('abe')
bus2.add_passenger('bertha')
print(bus1.passengers, bus2.passengers)
print(id(bus1.passengers), id(bus2.passengers))

# return 
# {'bertha', 'abe'} {'bertha', 'abe'}
# 112108429608 112108429608

当然如果改成如下形式,就会消除该问题:

class Bus(object):
    def __init__(self):
        self.passengers = set()
    def add_passenger(self, person):
        self.passengers.add(person)

bus1 = Bus()
bus2 = Bus()
bus1.add_passenger('abe')
bus2.add_passenger('bertha')
print(bus1.passengers,bus2.passengers)
print(id(bus1.passengers),id(bus2.passengers))

# return 
# {'abe'} {'bertha'}
# 111998300456 111998302472

先写这些吧~ 感觉还是半懂不懂,不过暂时先记住结论,以后传递参数的时候,一定要长一个心眼~

相关文章

  • python 函数 / 类的传参问题

    今天遇到了一个没想通的问题,先记录下来。 python 函数:三种类型的参数传递方式 函数传参 如上所示,是没有任...

  • Python的函数返回值返回的是值还是引用?

    关于Python函数传参是传值还是传引用?这一问题网上都有很多的讨论,这篇博客解释比较清楚,结论是:Python参...

  • OpenCV版本差异所引发的cv2.findContours()

    python开发:OpenCV版本差异所引发的cv2.findContours()函数传参问题 一、如遇以下问题:...

  • python函数

    python函数 什么是函数 函数语法 调用函数 函数参数形参与实参传参指定参数传参参数默认值可变参数参数解包参数...

  • Python 函数传参问题小记

    上次利用闭包的特性写一个计数器 ,代码是这样的: 输出: 其实运行上面的代码是会出错的...错误的原因是因为我们没...

  • CATIA Python接口:CATIA.SystemServi

    问题:CATIA automation接口,当函数引用传参,Python不能得到正确结果,怎么破? 比如,在aut...

  • Python共享传参

    函数的参数作为引用 Python 唯一支持的参数传递是 共享传参 ,也就是常说的引用传参。函数内部的形参是实参的别...

  • 研究Python中函数的传参方式

    注:原创研究目的:研究Python中函数的传参方式:传值、传地址研究对象:Python的list和Numpy的ar...

  • python函数传参

    * 和** test(*args)* 的作用其实就是把序列args中的每个元素,当作位置参数传进去。*所对应的形参...

  • Python函数传参

    函数代码块以def关键字开头,后接函数标识符名称和圆括号() 所有传入的参数和自变量都必须放在圆括号内,可以在圆括...

网友评论

      本文标题:python 函数 / 类的传参问题

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