1.* 和 ** 的用法
- 函数定义时接收不定长参数
def foo(*args, **kwargs):
pass
- 参数传递
# 如何在函数中接收元组、列表和字典
def X(*a, **b):
print(a)
print(b)
X(1,2,3,4,5) # (1, 2, 3, 4, 5),{}
X(a=1, b=2, c=3) # (), {'a': 1, 'b': 2, 'c': 3}
X(1,2,a=2,b=3) # (1, 2), {'a': 2, 'b': 3}
# 总结:带*的参数输出的是元祖,带**的参数输出的是字典.但是同时使用两者时, 调用时a=2后只能写等式的参数,U不能写数字
- import * 语法
1.文件 a.py
# 告诉别的包,import * 的时候,只能导all里面规定的对象.
__all__ = ['x', 'y']
# 下划线开头的变量不会被import * 导入.可以用from a import _x导入
_x = 123
y = 'abc'
sys = 'efg'
2.文件 b.py
from a import *
from a import sys
from a import _x
print(_x, y, sys) # 123 abc efg
- *的用法
# 这里的* 表示*后面的参数必须用关键词参数传参.
def foo(x, y, *, a, b):
print(x)
print(y)
print(a)
print(b)
foo(1, 2, a=3, b=4) # 1, 2, 3, 4
# *类似截取列表效果
list1 = [1, 2, 3, 4, 5, 6]
a, b, *_, c = list1
print(a, b, _, c) # 1 2 [3, 4, 5] 6
二.Python 的赋值和引用
- ==, is: == 判断的是值, is 判断的是内存地址 (即对象的id)
- 小整数对象: [-5, 256]
a = 3
b = 3
print(a is b) # True
- copy, deepcopy 的区别
浅拷贝
from copy import copy
a = [1, 2, 3, 4, ['a', 'b']]
c = copy(a)
a.append(5)
a[4].append('c')
print('a:', a, 'c:', c)
# a: [1, 2, 3, 4, ['a', 'b', 'c'], 5] c: [1, 2, 3, 4, ['a', 'b', 'c']]
print(a[4] is c[4]) # True
内层可变参数的地址相同
深拷贝
from copy import deepcopy
a = [1, 2, 3, 4, ['a', 'b']] # 原始对象
b = a # 赋值,传对象的引用
d = deepcopy(a) # 对象拷贝,深拷贝
a.append(5) # 修改对象a
a[4].append('c') # 修改对象a中的['a', 'b']数组对象
print('\t\t:a = ', a)
print('对象引用\t:b = ', b)
print('deepcopy\t:d = ', d)
# :a = [1, 2, 3, 4, ['a', 'b', 'c'], 5]
# 对象引用 :b = [1, 2, 3, 4, ['a', 'b', 'c'], 5]
# deepcopy :d = [1, 2, 3, 4, ['a', 'b']]
内层可变参数的地址不相同
def extendList(val, lst=[]):
lst.append(val)
return lst
list1 = extendList(10)
list2 = extendList(123, [])
list3 = extendList('a')
print(list1) # [10, 'a']
print(list2) # [123]
print(list3) # [10, 'a']
没有传列表进去, 不会创建新的内存地址:list1与list3地址相同
- 自定义 deepcopy:
from pickle import dumps, loads
my_deepcopy = lambda item: loads(dumps(item, 4))
# 习题
from copy import copy, deepcopy
from pickle import dumps, loads
a = ['x', 'y', 'z']
b = [a] * 3 # [['x','y','z'], ['x','y','z'], ['x','y','z']]
c = copy(b)
d = deepcopy(b)
e = loads(dumps(b, 4))
b[1].append(999)
b.append(777)
c[1].append(999)
c.append(555)
d[1].append(999)
d.append(333)
e[1].append(999)
e.append(111)
网友评论