Python day07
今天讲了浅拷贝深拷贝与可变类型和不可变类型,以及函数的定义,运用,参数,*args,**kwargs
可变与不可变类型:
可变类型: 值发生改变时,地址不变。:列表,字典,集合
不可变类型 值发生改变时,地址改变/:数字,字符串,元组,布尔类型
list1=[1,3,5,7]
print(id(list1))
list1.append(8) #2641347961416
#2641347961416
print(id(list1)) 列表增加了值,地址不变,集合,字典同理
******************************************************************
a='asasas'
print(id(a))
a=a.replace('s','w')
print(id(a))#1934527717592
#1934527718768
字符串替换了一些值,地址发生改变
a=True
print(id(a))
a=False
print(id(a))#140713642211664
#140713642211696 bool类型也是不可变类型
浅拷贝与深拷贝
潜拷贝:
方法:list.copy(), copy.copy()
浅拷贝:可变类型:共用同一个(里面的内容改变,地址不改变)
不可变类型:一开始是共用的,但一改变就不共用了
list1=[1,3,5,7]
list2=list1.copy()
print(list1,list2)
print(id(list1),id(list2)) #[1, 3, 5, 7] [1, 3, 5, 7]
#2989963895368 2989963895432
列表在浅拷贝时,内容一样,但会开辟一块新空间,所以地址不一样
******************************************************************************************
list1=[1,3,5,7]
list2=list1.copy()
list2[0]=0
print(list1,list2) 对列表2进行修改,不影响列表1,list[0]指向的地址不同,一开始共用一个地址,内容改变就不共用了
print(id(list1),id(list2)) #[1, 3, 5, 7] [0, 3, 5, 7]
#2651723948616 2651723948680
******************************************************************************************
list1=[1,3,5,7,['a','b','c']]
list2=list1.copy()
print(id(list1),id(list2)) 1589983142536 1590237527688
list2[4].append('d')
print(list1,list2) [1, 3, 5, 7, ['a', 'b', 'c', 'd']] [1, 3, 5, 7, ['a', 'b', 'c', 'd']]
print(id(list1),id(list2)) 1589983142536 1590237527688
对可变类型操作时,一个内容发生了改变,两个都发生改变,因为引用相同的地址,但各自地址不变
深拷贝:
方法:copy.deepcopy()
import copy
list1 = [3, 5, 8, 9, ['a', 'b', 'c']]
list2 = copy.deepcopy(list1) # 深拷贝
# list2.remove(9)
print(list1, list2) [3, 5, 8, 9, ['a', 'b', 'c']] [3, 5, 8, 9, ['a', 'b', 'c']]
print(id(list2)) 2144487407304
list2[4].append('hello')
print(list1, list2) [3, 5, 8, 9, ['a', 'b', 'c']] [3, 5, 8, 9, ['a', 'b', 'c', 'hello']]
print(id(list2)) 2144487407304 深拷贝,完全开辟一块新的空间,修改自己内容,自己的内容改变,另一个列表的内容不变,但是地址都不变
函数
函数的定义
def function():
函数的参数,关键字
def ab(a,b=10): b为默认值
print(a,b)
ab(10) #10 10,无参给b,就是默认值
ab(10,b=21) #10 21,若b有参,则为实参的值
**********************
def ab(b=10,a): #a不能在有默认值的参数后面,否则报错SyntaxError: non-default argument follows default argument
**********************
def ab(a,b,*args):
print(a,b,args)
ab(10,10) #10 10 () *args可以传入n个值并组成元组,也可以忽略不填,不填就返回一个空元组
**********************
def ab(a,b,*args): #若*args参数在最前面,所有实参都会付给*args ab(10,10,1,3,5)
print(a,b,args)
ab(10,10,1,3,5,7,9) #10 10 (1, 3, 5, 7, 9)
**********************
def ab(a,*args,b=0): 在*args后面的参数应该有默认值,或传参时指定b=值
print(a,b,args)
ab(10,1,3,5) #10 0 (1, 3, 5)
def ab(*args,a=0,b):
print(a,b,args)
ab(10,10,1,3,5,b=7) #0 7 (10, 10, 1, 3, 5)
*********************************************
**kwargs
def ab(**kwargs):
print(kwargs)
ab(a=1,b=2) #{'a': 1, 'b': 2} 字典的形式
函数中可变不可变类型对原值的影响
如果是可变类型,传参传的是地址,函数中内容改变,原内容改变。
不可开遍类型,函数中值改变,原值不改变,因为传参传的只是值,不是地址
list1=[1,3,5,7,[2,4]]
print(id(list1))
def abc(list1):
list1[4].append(9)
abc(list1)
print(list1) [1, 3, 5, 7, [2, 4, 9]]对于可变类型, 函数内容改变,,原内容改变
def abc(list1):
list1.append(9)
abc(list1)
print(list1) [1, 3, 5, 7, [2, 4], 9]函数内容改变,,原内容改变
********************************************
不可变类型
numbr=1
def abc(n):
n=2
abc(numbr)
print(numbr) #1 函数内值可变,地址发生改变,不影响原值
列题
1. 定义一个函数,有可变参数(全为数字),求最大值、最小值
def shuzi(*args):
print('最大值:{},最小值{}:'.format(max(*args),min(*args)))
shuzi(1,3,5,7,9)
********************************************
2. 定义一个函数,求1-n的范围内(参数是n),偶数的和
def sum(n):
sum=0
for i in range(1,n):
if i % 2 ==0:
sum+=i
print(sum)
sum(10)