01可变参数作为函数的形参
def fn(var1,var2 = []):
var2.append(var1)
print(var2)
期待结果
fn(3)
[3]
fn(4)
[4]
fn(5)
[5]
实际结果
fn(3)
[3]
fn(4)
[3, 4]
fn(5)
[3, 4, 5]
原因:函数运行时,形参并不是每次都被实例化,一直使用同意对象。 解决方法:提供一个新的对象,每次都要实例化一次
修改代码:
def fn2(var1,var2 = None):
if not var2:
var2 = []
var2.append(var1)
print(var2)
fn2(3)
[3]
fn2(4)
[4]
fn2(5)
[5]
注意:对于不可变数据类型,比如 元祖、字符创、整形,是不需要考虑这种情况的。
02可变数据类型作为类变量
错误代码:
class URLCatcher(object):
urls = []
def add_url(self,url):
self.urls.append(url)
a = URLCatcher()
a.add_url('www.baidu.com')
b = URLCatcher()
b.add_url('www.google.com')
print(b.urls)
print(a.urls)
期望结果
实际结果
['www.baidu.com', 'www.google.com']
['www.baidu.com', 'www.google.com']
修改代码
class URLCatcher02(object):
def __init__(self):
self.urls = []
def add_url(self,url):
self.urls.append(url)
03可变的分配错误
字典和列表属于可变对象,元祖属于不可变对象!
change = {'1':'啊','2':[2,2]}
change02 = change.copy()
change02['4'] = '斯'
print('change的值是:',change,'change02的值是:',change02)
解决方法 使用.copy() 或者 切片复制方法[:]