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

python

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。

以上是 Python中的赋值、深拷贝与浅拷贝(内存地址) 的全部内容, 来源链接: utcz.com/z/388854.html

回到顶部