1 #!/user/bin/env python 2 # -*- coding:utf-8 -*- 3 4 5 def add(a, b): 6 a += b 7 return a 8 9 10 if __name__ == '__main__': 11 a = 1 12 b = 2 13 c = add(a, b) 14 print(c) 15 print(a, b) 16 17 a = [1, 2] 18 b = [3, 4] 19 c = add(a, b) 20 print(c) 21 print(a, b) 22 23 a = (1, 2) 24 b = (3, 4) 25 c = add(a, b) 26 print(c) 27 print(a, b)
3 1 2 [1, 2, 3, 4] [1, 2, 3, 4] [3, 4] (1, 2, 3, 4) (1, 2) (3, 4)
-
不可变类型:变量赋值 a=5 后再赋值 a=10,这里实际是新生成一个 int 值对象 10,再让 a 指向它,而 5 被丢弃,不是改变a的值,相当于新生成了a。
-
可变类型:变量赋值 la=[1,2,3,4] 后再赋值 la[2]=5 则是将 list la 的第三个元素值更改,本身la没有动,只是其内部的一部分值被修改了。
python 函数的参数传递:
-
不可变类型:类似 c++ 的值传递,如 整数、字符串、元组。如fun(a),传递的只是a的值,没有影响a对象本身。比如在 fun(a)内部修改 a 的值,只是修改另一个复制的对象,不会影响 a 本身。
-
可变类型:类似 c++ 的引用传递,如 列表,字典。如 fun(la),则是将 la 真正的传过去,修改后fun外部的la也会受影响
1 #!/user/bin/env python 2 # -*- coding:utf-8 -*- 3 4 5 class Company: 6 def __init__(self, name, staffs=[]): 7 self.name = name 8 self.staffs = staffs 9 10 def add(self, staff_name): 11 self.staffs.append(staff_name) 12 13 def remove(self, staff_name): 14 self.staffs.remove(staff_name) 15 16 17 com1 = Company('com1', ['zy1','zy2']) 18 com1.add('zy3') 19 com1.remove('zy1') 20 print(com1.staffs) 21 22 com2 = Company('com2') 23 com2.add('zy') 24 print(com2.staffs) 25 26 print(Company.__init__.__defaults__) 27 28 com3 = Company('com3') 29 com3.add('another_zy') 30 print(com2.staffs) 31 print(com3.staffs) 32 print(com2.staffs is com3.staffs)
['zy2', 'zy3'] ['zy'] (['zy'],) ['zy', 'another_zy'] ['zy', 'another_zy'] True
因为com2和com3都没有传递list参数,而list是一个可变类型,对于参数的传递属于引用传递,于是com2和com3共用了默认的[]list,所以com2和com3的staffs是一样的