# a、b、c三个变量都引用(指向)了10
a = 10
b = a
c = a
print(id(a), id(b), id(c), id(10)) # id都一样
# a不再指向10,bc还指向10
a = 20
print(id(a), id(20), id(b), id(c)) # a变了,bc没变
# 函数调用传参 都是引用传递 id一致
num = 10001
print(id(num))
def func(my_num):
print(id(my_num))
func(my_num=num)
# 可变类型示例,两个list的id始终没有变化,但是数据内容改变了,说明列表是可变类型
my_list = [1, 2, 3]
your_list = my_list
print(id(my_list), id(your_list)) # 2493095416896 2493095416896
my_list[0] = 'hahaha'
print(id(my_list), my_list) #2493095416896 ['hahaha', 2, 3]
print(id(your_list), your_list) #2493095416896 ['hahaha', 2, 3]
#不可变类型示例
#修改字符串中的数据,本质是产生一个新的字符串,原字符串数据没有发生改变,其id也没有变化
#新的字符串的内容和原字符串不一样,id也和原字符串的id不一样
my_str1 = "123hello"
my_str2 = my_str1.replace("123","456")
print(id(my_str1),my_str1) #2493095464624 123hello
print(id(my_str2),my_str2) #2493095464880 456hello
图片参考链接:
https://www.runoob.com/w3cnote/python-understanding-dict-copy-shallow-or-deep.html
其实就是对象的引用(别名)。
拷贝父对象,不会拷贝对象的内部的子对象。
copy 模块的 deepcopy 方法,完全拷贝了父对象及其子对象。
list1 = [1, 2, [3, 4]]
list2 = list1.copy()
print("list1:", list1, id(list1))
print("list2:", list2, id(list2))
list1[2][0] = 5
print('修改了list1中的某个值')
print("list1:", list1, id(list1))
print("list2:", list2, id(list2))
"""
结论:这是【浅拷贝】!
通过copy函数,复制的对象的id发生了改变
原列表的值改变,新列表的值也跟着变
"""
# 导包使用 deepcopy深拷贝函数
from copy import deepcopy
list1 = [1, 2, [3, 4]]
list2 = deepcopy(list1)
print("list1:", list1, id(list1))
print("list2:", list2, id(list2))
list1[2][0] = 5
print('修改了list1中的某个值')
print("list1:", list1, id(list1))
print("list2:", list2, id(list2))
"""
结论:这是【深拷贝】!
通过copy.deepcopy函数,复制的对象不光id发生改变
原列表的值改变,新列表的值不跟着变
原列表和新列表完全没有任何关联!
"""