不可变数据类型:
# 不可变:
# 无论是b = b + b 还是b += b 都是属于重新赋值
def fun(b):
b = b + b
print(f"结束之后{id(b)}")
def fun1(b):
b += b
print(f"+=结束之后{id(b)}")
b = "a"
print(f"调用之前{id(b)}")
# fun(b) # 2400614325304 2400643655360
fun1(b) # 2907432590392 2907433477824
可变数据类型
# 可变:
# b = b + b 是重新赋值
# b += b 对原来的数据进行修改(b.extend(b))
def fun(b):
b = b + b
print(f"结束之后{id(b)}")
print(f"结束后的b{b}")
def fun1(b):
b += b
print(f"+=结束之后{id(b)}")
print(f"结束后的b{b}")
b = [1, 2]
print(b)
print(f"调用之前{id(b)}")
# fun(b) # 2665267946120 2665267946184
fun1(b) # 2424715960968 2424715960968
结论:
调用一个有参数的函数的时候, 传递的不是数值, 而是引用。
这主要是由于“=”操作符会新建一个新的变量保存赋值结果,然后再把引用名指向“=”左边,即修改了原来的b引用,使b成为指向新赋值变量的引用。而+=不会,直接修改了原来b引用的内容,事实上+=和=在python内部使用了不同的实现函数。