python---三种赋值方式:等号、浅拷贝、深拷贝

        说到三种赋值方式,我们先聊聊有哪些变量是可变的

一、验证变量是否可变

1、num数值变量

        由执行截图可见,当数值变量重新赋值时,id地址是改变了的。所以在本质上,重新复制后的num1可以理解为一个新的变量。所以,我们可以把数值变量当作不可变的变量

2、字符串变量

        由截图可见,与数值变量一样,重新赋值后,虽然变量名相同,但是id地址变了。所以重新赋值后的str1同样可以理解为一个新的变量。所以,我们也把字符串变量认为是不可变变量

3、字典变量

        由截图可见,更新字典中的值后,字典的地址没有改变,所以我们可以认为字典变量是可变变量

4、列表变量

        与3同理,列表变量也可以理解为可变变量

二、三种赋值方式

        接下来我们来讨论下三种赋值方式,我们这里是采取可变变量来验证的,因为这样才能通过修改变量的值来验证是哪一种赋值方式。

1、等号赋值

>>> list1 = [1, 2, {'a':97, 'b':98}]
>>> id(list1)
140082630034560
>>> list2 = list1
>>> id(list1)
140082630034560
>>> id(list2)
140082630034560
>>> list1
[1, 2, {'a': 97, 'b': 98}]
>>> list2
[1, 2, {'a': 97, 'b': 98}]

        我们用一个列表变量里面嵌套一个字典变量来验证。由图可见,等号赋值之后,赋值后的变量的id地址并没有改变。所以,我们可以得到结论:等号赋值时,实际上我们可以理解为引用,即两个变量指向的地址一样。

        我们来用代码验证下:

>>> list1[2]['a'] = 100
>>> list1
[1, 2, {'a': 100, 'b': 98}]
>>> list2
[1, 2, {'a': 100, 'b': 98}]

由此可见,变量list1里面嵌套的字典发生改变时,list2变量也会跟着变化。

2、浅拷贝

        顾名思义,浅层次的拷贝。即,有变量嵌套时,拷贝的是地址而不是值,这样的话,如果改了list1的值,那么list2的值也会跟着拷贝。

>>> import copy
>>>
>>> list1 = [1, 2, {'a':97, 'b':98}]
>>> list2 = copy.copy(list1)
>>> id(list1)
140263958727040
>>> id(list2)
140263955529792
>>>
>>> id(list1[2])
140263957210496
>>> id(list2[2])
140263957210496
>>>
>>> list1
[1, 2, {'a': 97, 'b': 98}]
>>> list2
[1, 2, {'a': 97, 'b': 98}]
 

图解:把list1的拷贝给list2时,list1内部嵌套的list1[2]变量的值并没有被拷贝,而是只拷贝了嵌套的地址。也就是浅层次的拷贝,所以叫做浅拷贝。

3、深拷贝

        顾名思义,深层次拷贝。即有变量嵌套时,拷贝的时具体的值而不是地址,这样的话,如果改了list1的值,那么list2的值不会受到影响。

>>> import copy
>>>
>>> list1 = [1, 2, {'a':97, 'b':98}]
>>> list2 = copy.deepcopy(list1)
>>> id(list1)
140263958728832
>>> id(list2)
140263958727040
>>> id(list1[2])
140263955536064
>>> id(list2[2])
140263957209728
>>>
>>> list1[2]['a'] = 101
>>> list1
[1, 2, {'a': 101, 'b': 98}]
>>> list2
[1, 2, {'a': 97, 'b': 98}]

图解:把list1的拷贝给list2时,list1内部嵌套的list1[2]变量的值会被拷贝,然后放进一块新的地址中。也就是深层次的拷贝,所以叫做深拷贝。

  • 16
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值