可变对象与不可变对像的区别

python与c++、c的中a=3的区别

与C语言和c++不同的是
在C语言和c++中a=3的意思是对a进行赋值预算使得a=3
在 Python 中,一切皆为对象
Python 中不存在值传递,一切传递的都是对象的引用,也可以认为是传址
a=3相当于在内存中存了两个值a和3的地址
而a=3相当对是a引用3这个值


可变对象和不可变对象的分类以及他们的区别

可变对象和不可变对象有哪些 可变对象:数组、字典、集合、列表

不可变对象:字符串、元组、数字(int、float)

可变对象与不可变对象的区别在于

 可变对象:改变对象内容,对象在内存中的地址不会被改变

不可变对象:改变对象内容,对象在内存中的地址会被改变;

如果必须存储一个不同的值,则必须创建新的对象

在不可变对象中值得改变如图所示

Python 中的变量有一个内存空间
具体的数据(对象)也有一个内存空间
而变量保存(指向)的是存储数据(对象)的内存地址,一般也叫对象引用
不可变对象是指对象内容本身不可变
变的是:改变了值,会创建新对象,然后变量改变了对象引用,指向了新对象,旧对象会被垃圾回收
 以下为不可变对象的例子
#int类型不可变对象
a=123
b=a
print(a,b,id(a),id(b))
#输出的结果为
#123 123 140717039809128 140717039809128#此时输出a和b的值相同都指向同一个地址
a+=2
#输出的结果为
print(a,b,id(a),id(b))
#125 123 140717039809192 140717039809128此时a指向的地址不再和b相同而是重新定义并指向了一个新的对象
#不可变对象-字符串
a = "test"
b = a
print(id(a))#1988455185072
print(id(b))#1988455185072
print(a, b)#test test

a += "123"

print(id(a))
print(id(b))
print(a, b)
#1988456479728
#1988455185072
#test123 test

 在可变对象中值得改变如图所示

可变对象变的是原来的对象的值不会再重新定义一个新的对象

以下为可变对象的例子

a = [1, 2, 3]
b = a

print(id(a))
print(id(b))
print(a, b)

a += [4, 5, 6]#因为列表为可变对象所以a的值改变了b的值也随之改变

print(a, b)
print(id(a))
print(id(b))

#因为 list 是可变对象,所以并不会将原来的值复制到新的内存地址再改变,而是直接在原来的内存地址上修改数据
#因为 a、b 都是指向原来的内存地址的,所以 a、b 变量保存的内存地址是一致的(对象引用是一致的),当然值也是一样的啦

# 输出结果
#[1, 2, 3] [1, 2, 3]
#[1, 2, 3, 4, 5, 6] [1, 2, 3, 4, 5, 6]
#2186004151680
#2186004151680

在函数中的传递同样也涉及到可变对象与不可变对象

#在函数中当传递给函数的是一个变量,实际上传递的是变量保存的对象引用(变量指向的内存地址)
#函数传递可变对象
def test_define(dicts, sets):
    dicts['age'] = 24
    sets.pop()
    print(dicts, sets)
dicts = {"age": 123}
sets = {1, 2}
print(dicts, sets)

test_define(dicts, sets)
print(dicts, sets)
# 输出结果
#{'age': 123} {1, 2}
#{'age': 24} {2}
#{'age': 24} {2}
#函数传递不可变对象
# 函数
def test_no_define(age, name):
    age = 123
    name = "poloyy"
    print(age, name)


age = 1
name = "yy"
print(age, name)

test_no_define(age, name)
print(age, name)
#输出结果
#1 yy
#123 poloyy
#1 yy
总结:
当函数参数传递的变量是不可变对象的时候,函数内改变变量值,函数外的变量不会随之改变
当函数参数传递的变量是可变对象的时候,函数内改变变量值,函数外的变量会随之改变
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值