• Python中变量、赋值、浅拷贝、深拷贝


    https://www.cnblogs.com/LetMe/p/6724555.html

    在理解浅拷贝和深拷贝之前,首先要理解学习一下变量在Python中是怎样存储的;

    变量的类型是分值引用与地址引用两种.

    python的一切变量都是对象,变量的存储,采用了地址引用的方式,存储的只是一个变量的值所在的内存地址,而不是这个变量的只本身。

    在Python中,是有多种数据类型:bool、int、long、float、string、list、dict、tuple、set;

    其中可分为基本数据类型和复杂数据结构;

    基本数据类型:bool、int、long、float、string;

    复杂数据结构:list、dict、tuple、set;(对于能存储基本数据类型的变量可以把它看做复杂数据结构)

    由于Python中的变量存储都是地址引用,所以说复杂数据结构(list、dict、tuple、set)中存储的变量也仅仅是变量的地址。

    一、变量的初始化(赋值):

    1.Python中变量的初始化就是在内存中新开辟一块存储变量的值的内存,把这块内存的地址赋值给变量。(变量中存的是值的地址)

      

    复制代码
     1 >>> str_1 = 'abc'
     2 >>> id(str_1)
     3 4300773168
     4 >>> str_2 = str_1
     5 >>> id(str_2)
     6 4300773168
    复制代码

    在给已经初始化的变量重新初始化的时候,就会重新更改变量中的地址。

    1 >>> str_1 = 123
    2 >>> id(str_2)
    3 4300773168
    4 >>> id(str_1)
    5 4297541792

     2.而在复杂数据结构中,更改数据结构中的元素(基本数据类型),仅仅是改变了这个元素的地址,而不会影响复杂数据结构本身的地址。

    复制代码
    1 >>> list_1 =[1,2,3]
    2 >>> id(list_1)
    3 4320183368
    4 >>> list_1.append(9)
    5 >>> list_1[2] = 22
    6 >>> list_1.pop(2)
    7 3
    8 >>> print(list_1,id(list_1))
    9 [1, 2, 22, 5, 6, 9] 4320183368
    复制代码

     通过上边的事例做出结论:

      当复杂数据结构(list、dict、tuple、set)赋值时,是在计算机中开辟一块内存来存储这个复杂数据结构的值,而修改其中元素的时候只是更改了复杂数据结构的元素的地址,不会影响复杂数据结构的地址(就像一个桌子上有坐着两个人,而桌子上的菜两个人是共同享有);当重新赋值时,会重新开辟新的内存来存储变量的值,把这块内存的地址存到变量中。(相当于桌子上的一个人移到了另一个桌子上吃)

    二、拷贝:

      在Python中,我们有时候要保存一份数据,再去对这块数据进行处理,而这个时候Python提供了两种拷贝方式:浅拷贝、深拷贝。

    1.浅拷贝

      浅拷贝: 不管是多么复杂的数据结构,浅拷贝只会拷贝第一层.

    复制代码
    1 import copy
    2 list_1 = [1,2,['a','b','c'],3]
    3 list_2 = list_1[:]
    4 # list_2 = copy.copy(list_1)浅拷贝的另一种方式
    5 list_1[2][1] = 'kk'
    6 print(list_1,list_2,id(list_1[2]),id(list_2[2]))
    7 [1, 2, ['a', 'kk', 'c'], 3]  [1, 2, ['a', 'kk', 'c'], 3] 4330513736 4330513736
    复制代码

    由于浅拷贝只会拷贝list_1的第一层,所以元素中的list的地址没有被更改,说明list_1和list_2共享同一个第二层的list。

    2.深拷贝:

      深拷贝会完全复制原变量的所有数据,在内存中生成一套完全一样的内容,我们对这两个变量中的一个进行任意修改都不会影响另一个变量。

    复制代码
    1 import copy
    2 list_1 = [1,2,['a','b','c'],3]
    3 list_2 = copy.deepcopy(list_1)
    4 list_1[2][1] = 'kk'
    5 print(list_1,list_2,list_1[2],list_2[2])
    6 [1, 2, ['a', 'kk', 'c'], 3]  [1, 2, ['a', 'b', 'c'], 3] 4330513736 4330512584
    复制代码
  • 相关阅读:
    [转]给定单链表,检测是否有环。如果有环,则求出进入环的第一个节点
    二叉树的后序遍历
    求二叉树叶子节点的个数
    随笔
    两个免费转换视频的软件,实现服务器端Video2FLV
    自制Flash FLV视频播放器
    Flash取得外部WEB参数的方法
    [转]javascript小技巧,超强推荐
    c#设计模式(转)
    ffmpeg和Mencoder使用实例小全
  • 原文地址:https://www.cnblogs.com/yuluoxingkong/p/8260825.html
Copyright © 2020-2023  润新知