Python 方法中的参数传递
Python 中的对象,可以用可变和不可变的标准来一分为二:
- 可变对象有:list、dictionary、set等容器。当此类对象的内容发生变化时,变量的对象引用是不会变化的。
- 不可变对象有:字符串、数字类型数据、元组等。Python中的变量存放的是对象引用,所以对于不可变对象而言,尽管对象本身不可变,但变量的对象引用是可变的。
在将可变对象作为参数进行传递时,需要特别注意程序的副作用对参数产生的持续性影响,我编写了一些例子来说明:
""" 可变对象作为参数时需要注意 """
# 可变对象作为函数参数的默认值
def test_func1(a=[]):
print(id(a))
def test_func2(a = []):
b = list(a)
print(id(b))
test_func1()
test_func1()
test_func1([])
test_func1([])
test_func1(list())
test_func1(list())
test_func2()
test_func2()
# 可变对象用于类的实例化
class LittleTest(object):
def __init__(self, para_list = []):
self.para_list = para_list
print("self.para_list id=%d"%id(self.para_list))
t1 = LittleTest()
t2 = LittleTest()
t3 = LittleTest([])
t4 = LittleTest([])
class Test(object):
def __init__(self, para_list = []):
self.para_list = list(para_list)
print("self.para_list id=%d"%id(self.para_list))
self.para_list.append("+1s")
t1 = Test()
t2 = Test()