Python中的赋值、深拷贝与浅拷贝(内存地址)

1、python中的可变对象与不可变对象

(1) 可变对象:dict,list

def dict_test():
    a = {}
    b = a
    print(id(a))                     # 140367329543360
    a[‘a‘] = ‘hhhh‘
    print(‘id a:‘ + str(id(a)))      # id a:140367329543360
    print(‘a:‘ + str(a))             # a:{‘a‘: ‘hhhh‘}
    print(‘id b:‘ + str(id(b)))      # id b:140367329543360
    print(‘b:‘ + str(b))             # b:{‘a‘: ‘hhhh‘}

if __name__ == ‘__main__‘:
    dict_test()

内存变化如下:

(2) 不可变对象:int,string,float,tuple

def int_test():
    i = 77
    j = 77
    print(id(77))                    #140396579590760
    print(‘i id:‘ + str(id(i)))      #i id:140396579590760
    print(‘j id:‘ + str(id(j)))      #j id:140396579590760
    print i is j                     #True
    j = j + 1
    print(‘new i id:‘ + str(id(i)))  #new i id:140396579590760
    print(‘new j id:‘ + str(id(j)))  #new j id:140396579590736
    print i is j                     #False

if __name__ == ‘__main__‘:
    int_test()

内存分配如下:

2、赋值、浅拷贝与深拷贝:

(1) b = a: 赋值引用,a 和 b 都指向同一个对象。

 (2) b = a.copy(): 浅拷贝, a 和 b 是一个独立的对象,但他们的子对象还是指向统一对象(是引用)。

    (3) b = copy.deepcopy(a): 深度拷贝, a 和 b 完全拷贝了父对象及其子对象,两者是完全独立的。

3、更多实例:

#!/usr/bin/python
# -*-coding:utf-8 -*-

import copy
a = [1, 2, 3, 4, [‘a‘, ‘b‘]]       #原始对象

b = a                              #赋值,传对象的引用
c = copy.copy(a)                   #对象拷贝,浅拷贝
d = copy.deepcopy(a)               #对象拷贝,深拷贝

a.append(5)                        #修改对象a
a[4].append(‘c‘)                   #修改对象a中的[‘a‘, ‘b‘]数组对象

print( ‘a = ‘, a )
print( ‘b = ‘, b )
print( ‘c = ‘, c )
print( ‘d = ‘, d )

运行结果如下:

(‘a = ‘, [1, 2, 3, 4, [‘a‘, ‘b‘, ‘c‘], 5])
(‘b = ‘, [1, 2, 3, 4, [‘a‘, ‘b‘, ‘c‘], 5])
(‘c = ‘, [1, 2, 3, 4, [‘a‘, ‘b‘, ‘c‘]])
(‘d = ‘, [1, 2, 3, 4, [‘a‘, ‘b‘]])

4、按照具体需求选择合适的赋值或者拷贝形式:

 建议:在内存足够的情况下,选择深拷贝,这样逻辑处理独立,不会产生上下文的影响,不容易发生难以解决的bug。

原文地址:https://www.cnblogs.com/yjd_hycf_space/p/11923106.html

时间: 2024-08-11 01:34:01

Python中的赋值、深拷贝与浅拷贝(内存地址)的相关文章

Python中的赋值(复制)、浅拷贝与深拷贝

https://zhuanlan.zhihu.com/p/54011712 首先需要了解下几个概念 变量:是一个系统表的元素,拥有指向对象的连接空间 对象:被分配的一块内存,存储其所代表的值 引用:是自动形成的从变量到对象的指针 类型:属于对象,而非变量 不可变对象:一旦创建就不可修改的对象,包括字符串.元组.数值类型 (该对象所指向的内存中的值不能被改变.当改变某个变量时候,由于其所指的值不能被改变,相当于把原来的值复制一份后再改变,这会开辟一个新的地址,变量再指向这个新的地址.) 可变对象:

Python中复制、深拷贝和浅拷贝的区别

深拷贝定义(deepcopy) 在Python中,由于一切皆对象,所以任何变量都可以被引用,也即可以被赋值给任何变量.但是在Python中,给变量赋值,是区分的,一般情况下,Python中的变量赋值都是浅拷贝,如果需要使用深拷贝,需要特别指定. 深拷贝是对原对象的"复制以及粘贴",其实就是在内存中重新开辟了一个新的内存空间来存放这一份数据,两个变量其实是两个不一样的变量,仅仅是数据值相同而已,对两个变量的操作不会相互影响. 浅拷贝(copy) 在Python中进行数据的浅拷贝时,如果此

Python中的赋值、浅拷贝、深拷贝

在理解浅拷贝和深拷贝之前,首先要理解学习一下变量在Python中是怎样存储的: 变量的类型是分值引用与地址引用两种. python的一切变量都是对象,变量的存储,采用了地址引用的方式,存储的只是一个变量的值所在的内存地址,而不是这个变量的只本身. 在Python中,是有多种数据类型:bool.int.long.float.string.list.dict.tuple.set; 其中可分为基本数据类型和复杂数据结构: 基本数据类型:bool.int.long.float.string; 复杂数据结

Python中的赋值,浅拷贝和深拷贝的区别

赋值 内存地址的引用,所有的改变都会同步 测试代码 #coding:utf-8 import copy a=['a','b',1,[1,2,3]] b = a #对象赋值,所有改动都会联动 a.append('d') a[0]='aaa' a[3].append(4) print a print b 运行结果 ['aaa', 'b', 1, [1, 2, 3, 4], 'd'] ['aaa', 'b', 1, [1, 2, 3, 4], 'd'] 浅拷贝 str,num等深浅拷贝都一样,list

python中的“赋值与深浅拷贝”

Python中,赋值与拷贝(深/浅拷贝)之间是有差异的,这主要源于数据在内存中的存放问题,本文将对此加以探讨. 1 赋值(添加名字) 赋值不会改变内存中数据存放状态,比如在内存中存在一个名为data的数据,此时若执行语句data_01 = data,则现在该份数据有了两个名称(data和data_01),其余都不发生改变,使用任何一个名称对数据进行操作,那么用另外一个名称拿数据时,数据会呈现之间发生的改变.示例如下: 图中,给列表分配了两个名称a与b,对a做改变时b会同样改变,对b做改变时a也会

Python中的赋值和拷贝

赋值 在python中,赋值就是建立一个对象的引用,而不是将对象存储为另一个副本.例如: >>> a=[1,2,3] >>> b=a >>> c=a 对象是[1,2,3],分别由a.b.c三个变量其建立了对应的引用关系.而三个变量都不独占对象[1,2,3],或者说,可以通过任何一个变量来修改[1,2,3]这个对象. >>> c.append(4) >>> c [1, 2, 3, 4] >>> a [

探究JS中对象的深拷贝和浅拷贝

深拷贝和浅拷贝的区别 在讲深拷贝和浅拷贝的区别之前,回想一下我们平时拷贝一个对象时是怎么操作的?是不是像这样? var testObj1 = {a: 1, b:2}, testObj2=testObj1; testObj1.a = 7; console.log(testObj1); //{a: 7, b:2} console.log(testObj2); //{a: 7, b:2} 发现问题了吗?当testObj1变化时,testObj2相应的属性跟着变化了.这就是属于浅拷贝了,而所谓的深拷贝就

Python中有关赋值的奇怪现象

下面看两个例子: 1) 2) 看到区别了吧~~ 在第1)个例子中a的值改变不影响b的值:而在2)例子中L1的值改变了会影响L2的值. 其实并不难理解,再看第3)个例子: 小结:如果是对整个变量重新赋值,则这个变量指向原来数值的指针会断掉,转而指向新的值:而如果只是对变量里面的一部分重新赋值(改变),则只不会断掉指针,这时改变的就是内存中的数值,其他指向这个数值的输出结果也会改变. Python中有关赋值的奇怪现象,布布扣,bubuko.com

Python中变量赋值的8种形式、需要注意哪些细节?

本文解释python中变量赋值的形式,并解释一些细节. python中变量赋值的几种形式 1 x = "long" # (1).基本形式 2 x, y = "long", "shuai" # (2).元组对应赋值 3 [x, y] = ["long", "shuai"] # (3).列表对应赋值 4 a, b, c, d = "long" # (4).序列赋值 5 a, *b = 'lo