1.函数传参
对于函数的传参而言,在python中我们是无法选择传参还是传递引用。如果传递的是列表,字典,则会默认为传引用。即在函数内部对参数进行修改后,则参数对应的原始对象也会被修改,反之若传入的参数为整数,字符串等内容,则不会被修改。
如果希望禁止函数修改列表,则可以对列表运用切片表示法创建列表副本如下
function_name(list_name[:])
2.列表中元素批量修改
关于对列表中元素进行批量修改的时候,要格外注意以下两种写法,其中第一种的修改过后对于列表中的元素不会进行修改,而第二种可以做到。要分情况注意使用!
for magician in magicians:
magician='the great '+magician
#这种更改方法是错误的
n=len(magicians)
for i in range(n):
magicians[i]='the great '+magicians[i]
#这种更改方法是正确的
3.关于函数中**参数的个人理解
在python编程:从入门到实践一书中,给出的定义是:
形参**user_info中的两个星号让Python创建一个名为user_info的空字典,并将收到的所
有名称—值对都封装到这个字典中。在这个函数中,可以像访问其他字典那样访问user_info中的
名称—值对。
这样看可能还不是很清晰,我们引入书上代码:
def build_profile(first, last, **user_info):
"""创建一个字典,其中包含我们知道的有关用户的一切"""
profile = {}
profile['first_name'] = first
profile['last_name'] = last
for key, value in user_info.items():
profile[key] = value
return profile
user_profile = build_profile('albert', 'einstein',
location='princeton',
field='physics')
print(user_profile)
输出的结果为:
{‘first_name’: ‘albert’, ‘last_name’: ‘einstein’,
‘location’: ‘princeton’, ‘field’: ‘physics’}
在我自己写代码时,会发现如下情况,如果后面的**参数直接引用字典dict类型是会报错的,报错内容如下
TypeError: build_a_person() takes 2 positional arguments but 3 were given
报错时的源代码如下:
def build_a_person(first_name,last_name,**other_data):
person={}
person['first_name']=first_name
person['last_name']=last_name
for key,value in other_data.items():
person[key]=value
return person
people={
'age':18,
'country':'China'
}
people=build_a_person('Wang','Yu hao',people)
print(people)
而如果希望代码不报错,除了按照书上写法外,也可以这样进行修改:
def build_a_person(first_name,last_name,**other_data):
person={}
person['first_name']=first_name
person['last_name']=last_name
for key,value in other_data.items():
person[key]=value
return person
people={
'age':18,
'country':'China'
}
people=build_a_person('Wang','Yu hao',other_data=people)
print(people)
而对于书中代码和上面代码输出的结果是不同的,输出结果为:
{‘first_name’: ‘Wang’, ‘last_name’: ‘Yu hao’, ‘other_data’: {‘age’: 18, ‘country’: ‘China’}}