python基本数据类型--可变不可变

python有五种基本数据类型:int,、str、list、tuple、dict,其中可变类型有list、dict,不可变类型有int、str、tuple

私以为可变与否,取决于能否在变量的值发生改变的情况下,允许其内存地址不改变,如下代码:

list1 = [1, 2, 3, 4]
print("list1的值:", list1, "地址:", id(list1))
list1.pop()
print("list1的值:", list1, "地址:", id(list1))
dict1 = dict()
print("dict1的值:", dict1, "地址:", id(dict1))
dict1.update({"hello": "world"})
print("dict1的值:", dict1, "地址:", id(dict1))
# list1的值: [1, 2, 3, 4] 地址: 43626056
# list1的值: [1, 2, 3] 地址: 43626056
# dict1的值: {} 地址: 43538400
# dict1的值: {'hello': 'world'} 地址: 43538400

由此可见,对于python中一个变量的创建,不可以直接的理解成在内存空间里开辟一块空间,左边存变量名,右边存变量值。

私以为,创建变量时,python先获取一块内存空间用以存储变量值,再获取一块空间用以储存变量名,和储存变量值的空间的内存地址,或者说指向存储变量值空间的引用。而可变,即允许存储变量名空间这边不改变,存储变量值空间的值发生改变。由此打开了潘多拉的魔盒

赋值、copy和deepcopy

让一个变量存储值,可以直接赋值,也可以使用copy和deepcopy

赋值:

由上面的描述可知,当赋值时,python获取了两块内存空间,一块储存值,一块存储变量名和另一块内存空间的地址。这样就可以通过内存地址找到变量值。即使是可变类型,在赋值时依然适用这个规则。而把一个变量赋值给另一个变量就是把变量值的内存地址赋值一份。

a = [1, 2, 3]
b = a
print(id(a))
print(id(b))
# 43888200
# 43888200

copy:

将一个变量复制一份,改变新变量的值但是原变量值不变,可以用copy来实现

import copy

a = [1, 2, 3]
b = copy.copy(a)
b.append(4)
print("a的地址和值:", id(a), a)
print("b的地址和值:", id(b), b)
# a的地址和值: 44259080 [1, 2, 3]
# b的地址和值: 44259336 [1, 2, 3, 4]

deepcopy:

在copy的基础上,如果原变量的值包含可变类型的子变量,deepcopy会访问子元素做深度拷贝,如下b的内存地址改变了,但是b[3]的地址却没变。而c、c[3]的地址都发生改变

import copy

a = [1, 2, 3, [1, 2, 3]]
b = copy.copy(a)
c = copy.deepcopy(a)
print(id(a), id(a[3]))
print(id(b), id(b[3]))
print(id(c), id(c[3]))
# 44259336 44259080
# 44260488 44259080
# 44260424 44260360

猜你喜欢

转载自blog.csdn.net/weixin_40283460/article/details/84561404