Python注意参数传递

注意传递参数的时候,不好传递空列表,不然有时会出现一些无法理解的问题

def add(a, b):
    a += b
    return a


class company(object):
    def __init__(self, name, stuff=[]):
        self.name = name
        self.stuff = stuff

    def add(self, stuff_name):
        self.stuff.append(stuff_name)

    def remove(self, stuff_name):
        self.stuff.remove(stuff_name)


def bad_append(new_item, a_list=[]):
    a_list.append(new_item)
    return a_list


if __name__ == '__main__':
    a = 1
    b = 2
    print(add(a, b))
    print(a)
    print(b)

    a = [1, 2]
    b = [3, 4]
    print(add(a, b))
    print(a)
    print(b)

    a = (1, 2)
    b = (3, 4)
    print(add(a, b))
    print(a)
    print(b)

    com2 = company("com2")
    com2.add("bobby")
    print(com2.stuff)

    com3 = company("com3")
    com3.add("bobby5")
    print(com2.stuff)
    print(com3.stuff)

    print(bad_append('1'))
    print(bad_append('2'))
输出
3
1
2
[1, 2, 3, 4]
[1, 2, 3, 4]
[3, 4]
(1, 2, 3, 4)
(1, 2)
(3, 4)
['bobby']
['bobby', 'bobby5']
['bobby', 'bobby5']
['1']
['1', '2']

所以下次传列表参数的时候,记住不要传递[],而是可以传为None
如:

def bad_append(new_item, a_list=None):
	if a_list == None:
		a_list = []
    a_list.append(new_item)
    return a_list

这样就可以了。

### Python 函数参数传递机制 #### 值传递与引用传递的概念 在 Python 中,函数调用时参数的传递可以分为值传递和引用传递。对于可变对象(如整数、字符串、元组),当作为参数传递给函数时采用的是值传递;而对于可变对象(列表、字典等),则采用引用传递。 - **值传递**意味着传递的是数据的一个副本,在函数内部修改会影响到外部的实际参数[^1]。 - **引用传递**则是将对象的引用(即地址)传递给了形参,因此如果在函数内改变了该对象的内容,则会影响到原始的对象[^3]。 #### 实际案例分析 下面通过具体的例子来展示这两种同的行为: ```python def modify_value(x): x += 5 a = 10 modify_value(a) print(a) # 输出仍然是10,因为int是可变类型,这里发生了值传递 ``` 而如果是可变类型的对象情况就一样了: ```python def append_to_list(lst, item): lst.append(item) my_list = [1, 2, 3] append_to_list(my_list, 4) print(my_list) # 结果为[1, 2, 3, 4], 列表被原地修改了,这是由于引用传递的结果 ``` 另外需要注意的一点是在定义带有默认参数值的情况下,默认参数只会在第一次加载模块的时候创建一次,并且它们也是按照上述规则来进行处理的。 #### 可变数量的参数 Python 还支持接收定数目位置参数(*args) 和关键字参数(**kwargs),这使得编写更加灵活通用的功能成为可能[^4]: ```python def my_function(*args, **kwargs): print(f"Positional arguments: {args}") print(f"Keyword arguments: {kwargs}") my_function(1, 'two', three=3) ``` 这段代码将会打印出所有传入的位置参数作为一个 tuple (`args`) ,以及所有命名的关键字参数作为一个 dictionary (`kwargs`).
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值