持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第1天,点击查看活动详情
引用和拷贝的区别
引用=赋值 相当于当前变量直接指向被引用/赋值变量内存地址(可以理解成指向了a的内存地址,更直白点就是a回家的地址,如果a搬家了,地址发生了改变,并不会影响b因为b还是记录的a以前的地址)
例如:a=1 b=a 假设a此时的内存地址是0xx1 b的内存地址也是0xx1,但是此时如果a的内存地址变成0xx2并不会影响b,因为b的内存地址依然是0xx1
不可变数据类型:
Python 3.6.13 |Anaconda, Inc.| (default, Feb 23 2021, 12:58:59)
[GCC Clang 10.0.0 ] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> a=1
>>> id(a)
4514080032
>>> b=a
>>> id(b)
4514080032
>>> b
1
>>> a=2
>>> id(a)
4514080064
>>> id(b)
4514080032
>>> b
1
>>> a
2
可变数据类型:对于可变数据类型而言,有少许不同,因为可变数据类型和不可变数据类型的缘故,a的append行为可以理解成a重新装修了,本质地址没变,所以通过a的地址和b的地址都可以找到新装修的房子,但是如果a搬了家(a=[2])即使搬到了和以前一摸一样的房子(外形/值),但是由于b还保存的原来的地址,她找到的还是之前的房子,而不是新房子
ython 3.6.13 |Anaconda, Inc.| (default, Feb 23 2021, 12:58:59)
[GCC Clang 10.0.0 ] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> a=[1]
>>> b=a
>>> id(a)
140620018793352
>>> id(b)
140620018793352
>>> a.append(2)
>>> a
[1, 2]
>>> b
[1, 2]
>>> id(a)
140620018793352
>>> id(b)
140620018793352
>>> a=[2]
>>> a
[2]
>>> b
[1, 2]
>>> id(a)
140620018836168
>>> id(b)
140620018793352
拷贝
对于不可变数据类型,赋值、浅拷贝和深拷贝没有区别,可以理解成bcd都拿的是1的地址
>>> import copy
>>> a=1
>>> b=a
>>> c=copy.copy(a)
>>> d=copy.deepcopy(a)
>>> a,b,c,d
(1, 1, 1, 1)
>>> a=2
>>> a,b,c,d
(2, 1, 1, 1)
对于可变数据类型而言,赋值等于拿到[]这个可变数据类型的地址,而浅拷贝和深拷贝是重新建了一个[],所有当a往[]添加东西的时候 因为b是旧的地址所有会发生变化,而拷贝由于是新建的[]则不会有影响
>>> import copy
>>> a=[1]
>>> b=a
>>> c=copy.copy(a)
>>> d=copy.deepcopy(a)
>>> a.append(2)
>>> a,b,c,d
([1, 2], [1, 2], [1], [1])
>>> a=[3]
>>> a,b,c,d
([3], [1, 2], [1], [1])
至于深拷贝与前拷贝就直接看下面的例子吧,一句话概括顶层拷贝和全拷贝
a=[[1],2]
>>> b=a
>>> c=copy.copy(a)
>>> d=copy.deepcopy(a)
>>> a,b,c,d
([[1], 2], [[1], 2], [[1], 2], [[1], 2])
>>> a.append(3)
>>> a,b,c,d
([[1], 2, 3], [[1], 2, 3], [[1], 2], [[1], 2])
>>> a[0].append(2)
>>> a,b,c,d
([[1, 2], 2, 3], [[1, 2], 2, 3], [[1, 2], 2], [[1], 2])
>>>
下面说说 import 和 from xx import x
from 模块名 import *
xxx = 拷贝 # 能修改属性值
import 模块名
模块名.xxx = 引用
函数,类... : "import 模块名" 和 "from 模块名 import *" 都是引用
解释如下:拷贝和引用对于不可变数据类型没有区别,所以这里第一次from拿到了a.A这个属性的地址,并赋值给了A ,接下来改变了A的地址,但是没有改变a.A的地址,所有第二次from的时候值依然没变
from a import A
print(A)
print(id(A))
A=2
print(id(A))
from a import A
print(A)
print(id(A))
1
4369552672
4369552704
1
4369552672
解释如下:由于改变了a.A的地址所有 重新import的时候值发生了改变
import a
print(id(a))
print(id(a.A))
print(a.A)
a.A=2
print(id(a))
print(id(a.A))
import a
print(id(a))
print(id(a.A))
print(a.A)
140398843720712
4433487136
1
140398843720712
4433487168
140398843720712
4433487168
2