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
总结: 当函数参数传递的变量是不可变对象的时候,函数内改变变量值,函数外的变量不会随之改变 当函数参数传递的变量是可变对象的时候,函数内改变变量值,函数外的变量会随之改变