还搞不清楚浅拷贝和深拷贝??那就点进来

改了副本,原件也跟着变?Python拷贝的坑我帮你踩过了 当你的对象是自定义类的实例时,copy和deepcopy的行为可以通过特殊方法控制。# 控制浅拷贝的行为# 控制深拷贝的行为__copy__控制浅拷贝时怎么复制,控制深拷贝时怎么处理。如果你不实现这两个方法,copy和deepcopy会默认复制对象的所有属性。但可能并不符合你的预期——比如,你可能希望modules列表在浅拷贝时共享,在深拷贝时独立。最佳实践:如果你不确定,那就用deepcopy。虽然慢一点,但安全。当你发现性能成了瓶颈,再考虑优化成浅拷贝或自定义拷贝逻辑。操作外层容器内层元素。 阅读详情

浅拷贝&深拷贝

在我们的日常的学习或者开发中基本上必须进行的一个操作就是对象拷贝,但是其中也存在着一些小细节,今天我们就来梳理一下。


1、值类型与引用类型

这两个概念的区分,对于理解深、浅拷贝的理解而言是十分重要的。

引用Java圣经的一句话:

《Java编程思想》:Java中一切都可以视为对象。

所以在学习Java的过程中,我们要习惯用引用去操作对象。

接着我们来说一下引用类型和值类型

  • 引用类型:基本的数据类型(四类八种)

    • 四类:整型、浮点型、字符型、布尔型

    • 八种:整型4种——byte、short、int、long

      ​ 浮点型2种——float、double

      ​ 字符型——char

      ​ 布尔型——boolean

  • 值类型:数组、类Class、枚举Enum、基本数据类型的包装类Integer等

因此,操作引用类型时一般为引用传递,而操作基本类型时一般都为值传递。

为了便于下文的讲述和举例,我们在这里先定义两个类:Student(学生类)和Major(所学专业类),且二者为包含关系:

package edu.zhku.test04;

public class Major {
    private String majorName;   //专业名称
    private long majorId;   //专业代号

    /*构造器、get方法、set方法、toString方法都省略*/
}
package edu.zhku.test04;

public class Student {
    private String name;    //姓名
    private int age;    //年龄
    private Major major;    //所学的专业

    /*构造器、get方法、set方法省略*/
}

其类的结构图如 图1-1所示。

在这里插入图片描述

图 1-1

2、赋值、浅拷贝和深拷贝

2.1、赋值

赋值是日常编程过程最常见的操作,最简单的比如:

package edu.blog.test04;

public class CopyTestDemo01 {
    public static void main(String[] args) {
        Major major = new Major("IoT", 10086);
        System.out.println(major);

        Student student01 = new Student("zhangsan", 3, major);
        System.out.println(student01);

        Student student02 = student01;
        System.out.println(student02);
    }
}
结果:
edu.blog.test04.Major@1b6d3586
edu.blog.test04.Student@4554617c
edu.blog.test04.Student@4554617c

其实严格来说,这并不是算是对象拷贝,因为拷贝的仅仅是引用关系(即内存地址),并没有生成新的实例化对象。由上面例子的输出也可证明。

其内存模式如 图2-1所示。

图 2-1

2.2、浅拷贝

浅拷贝属于对象克隆方式的一种,重要的特性体现在“浅”这个字上。

例如,我们试图通过student01实例化对象,拷贝得到student02,如果是浅拷贝这种方式,大致的模型可以示意成如下图 2-2。

在这里插入图片描述

图 2-2

很明显,值类型的字段会赋值一份,而引用类型的字段拷贝仅仅是引用地址,而该引用地址指向的的实例对象空间其实是同一份(只有一份)。

我想通过图 2-2也已经表达得相当明显了。


2.3、浅拷贝代码的实现

如果我想通过student01拷贝得到student02,浅拷贝的典型方式就是:对象克隆,即让复制对象的类实现Cloneable接口,并重写clone()方法即可。

tips:关于对象克隆,之前有一篇文章相关的文章。

示例:

package edu.blog.test04;

public class Student implements Cloneable{
    private String name;    //姓名
    private int age;    //年龄
    private Major major;    //所学的专业

    public Student() {
    }

    public Student(String name, int age, Major major) {
        this.name = name;
        this.age = age;
        this.major = major;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public Major getMajor() {
        return major;
    }

    public void setMajor(Major major) {
        this.major = major;
    }

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", major=" + major +
                '}';
    }

    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();
    }
}
package edu.blog.test04;

public class CopyTestDemo02 {
    public static void main(String[] args) throws CloneNotSupportedException {
        Major major = new Major("物联网工程", 1001);
        Student student01 = new Student("zhangsan", 18, major);

        //由 student01 拷贝得到 student02
        Student student02 = (Student) student01.clone();

        System.out.println(student01 == student02);
        System.out.println("=========================");
        System.out.println(student01);
        System.out.println(student02);
        System.out.println("=========================");

        System.out.println();
        System.out.println("浅拷贝操作");
        //修改 student01 的值类型字段
        student01.setAge(30);

        //修改 student01 的引用类型字段
        major.setMajorName("计算机科学技术");
        major.setMajorId(8888);
        System.out.println(student01 == student02);
        System.out.println("=========================");
        System.out.println(student01);
        System.out.println(student02);
    }
}
结果:
false
=========================
Student{name='zhangsan', age=18, major=Major{majorName='物联网工程', majorId=1001}}
Student{name='zhangsan', age=18, major=Major{majorName='物联网工程', majorId=1001}}
=========================

浅拷贝操作
false
=========================
Student{name='zhangsan', age=30, major=Major{majorName='计算机科学技术', majorId=8888}}
Student{name='zhangsan', age=18, major=Major{majorName='计算机科学技术', majorId=8888}}

从结果可以看出:

  • student01==student02打印false,说明clone()方法确实克隆出一个新的对象(内存地址不同);
  • 修改值类型字段并不影响克隆出来的新的对象,和预期相符合;
  • 修改了student01内部的引用类型,克隆出来的student02也会相应改变。

2.4、深拷贝

深拷贝相比较于上述所展示的浅拷贝,除了值类型字段会赋值一份外,引用类型的字段所指向的对象实例空间,也会在堆内存中创建一个副本,如下图 2-3所示。

图 2-3

2.5、深拷贝代码的实现

2.5.1、深度遍历式拷贝

虽然clone()方法可以完成对象的拷贝工作,但是注意:clone()方法默认的是浅拷贝行为。若想实现深拷贝需要覆写clone()方法实现引用对象的深度遍历式拷贝。

就上面而言,想实现深拷贝,首先需要对更深一层次的引用类Major类做改造,让其也实现Cloneable接口并重写clone()方法:

package edu.blog.test04;

public class Major implements Cloneable{
    private String majorName;   //专业名称
    private long majorId;   //专业代号

    public Major() {
    }

    public Major(String majorName, long majorId) {
        this.majorName = majorName;
        this.majorId = majorId;
    }

    public String getMajorName() {
        return majorName;
    }

    public void setMajorName(String majorName) {
        this.majorName = majorName;
    }

    public long getMajorId() {
        return majorId;
    }

    public void setMajorId(long majorId) {
        this.majorId = majorId;
    }

    @Override
    public String toString() {
        return "Major{" +
                "majorName='" + majorName + '\'' +
                ", majorId=" + majorId +
                '}';
    }

    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();
    }
}

其次我们还需要在顶层的调用类中重写clone()方法,来调用引用类型字段的clone()方法实现深度拷贝,对于此文章来说便是Student类:

package edu.blog.test04;

public class Student implements Cloneable {
    private String name;    //姓名
    private int age;    //年龄
    private Major major;    //所学的专业

    public Student() {
    }

    public Student(String name, int age, Major major) {
        this.name = name;
        this.age = age;
        this.major = major;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public Major getMajor() {
        return major;
    }

    public void setMajor(Major major) {
        this.major = major;
    }

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", major=" + major +
                '}';
    }

    @Override
    public Object clone() throws CloneNotSupportedException {
        Student student = (Student) super.clone();
        student.major = (Major) major.clone(); // 这一步很重要!!!
        return student;
    }
}

测试代码:

package edu.blog.test04;

public class CopyTestDemo03 {
    public static void main(String[] args) throws CloneNotSupportedException {
        Major major = new Major("通信工程", 1002);
        Student student01 = new Student("lisi", 22, major);

        //由 student01 拷贝得到 student02
        Student student02 = (Student) student01.clone();

        System.out.println(student01 == student02);
        System.out.println("=========================");
        System.out.println(student01);
        System.out.println(student02);
        System.out.println("=========================");

        System.out.println();
        System.out.println("深拷贝操作");
        //修改 student01 的值类型字段
        student01.setAge(35);

        //修改 student01 的引用类型字段
        major.setMajorName("网络工程");
        major.setMajorId(6666);
        System.out.println(student01 == student02);
        System.out.println("=========================");
        System.out.println(student01);
        System.out.println(student02);
    }
}
结果:
false
=========================
Student{name='lisi', age=22, major=Major{majorName='通信工程', majorId=1002}}
Student{name='lisi', age=22, major=Major{majorName='通信工程', majorId=1002}}
=========================

深拷贝操作
false
=========================
Student{name='lisi', age=35, major=Major{majorName='网络工程', majorId=6666}}
Student{name='lisi', age=22, major=Major{majorName='通信工程', majorId=1002}}

很明显,这时候student01和student2两个对象就完全独立了,不受互相的干扰。

2.5.2、利用反序列化实现深拷贝

之前已经在文章《序列化&反序列化》中就已经详细梳理和总结了「序列化和反序列化」这个知识点了。

利用反序列化技术,我们也可以从一个实例对象深拷贝出另一个复制实例对象,而且利用反序列化可以十分有效地解决多层嵌套式的深拷贝问题。

所以我们这里改造一下Student类,让其clone()方法通过序列化和反序列化的方式来生成一个原对象的深拷贝副本:

package edu.blog.test05;

import java.io.*;

public class Student implements Serializable {

    private String name;  // 姓名
    private int age;      // 年龄
    private Major major;  // 所学专业

    public Student() {
    }

    public Student(String name, int age, Major major) {
        this.name = name;
        this.age = age;
        this.major = major;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public Major getMajor() {
        return major;
    }

    public void setMajor(Major major) {
        this.major = major;
    }

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", major=" + major +
                '}';
    }

    public Student clone() {
        try {
            // 将对象本身序列化到字节流
            ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
            ObjectOutputStream objectOutputStream =
                    new ObjectOutputStream(byteArrayOutputStream);
            objectOutputStream.writeObject(this);

            // 再将字节流通过反序列化方式得到对象副本
            ObjectInputStream objectInputStream =
                    new ObjectInputStream(new ByteArrayInputStream(byteArrayOutputStream.toByteArray()));
            return (Student) objectInputStream.readObject();

        } catch (IOException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }

        return null;
    }
}

当然这种情况下要求被引用的子类(比如这里的Major类)也必须是可以序列化的,即实现了Serializable接口:

package edu.blog.test05;

import java.io.Serializable;

public class Major implements Serializable {
    private String majorName;   //专业名称
    private long majorId;   //专业代号

    public Major() {
    }

    public Major(String majorName, long majorId) {
        this.majorName = majorName;
        this.majorId = majorId;
    }

    public String getMajorName() {
        return majorName;
    }

    public void setMajorName(String majorName) {
        this.majorName = majorName;
    }

    public long getMajorId() {
        return majorId;
    }

    public void setMajorId(long majorId) {
        this.majorId = majorId;
    }

    @Override
    public String toString() {
        return "Major{" +
                "majorName='" + majorName + '\'' +
                ", majorId=" + majorId +
                '}';
    }
}

测试代码:

package edu.blog.test05;

public class CopyTestDemo04 {
    public static void main(String[] args) {


        Major major = new Major("信息管理与信息系统", 1003);
        Student student01 = new Student("wangwu", 22, major);

        //由 student01 拷贝得到 student02
        Student student02 = (Student) student01.clone();

        System.out.println(student01 == student02);
        System.out.println("=========================");
        System.out.println(student01);
        System.out.println(student02);
        System.out.println("=========================");

        System.out.println();
        System.out.println("深拷贝操作");
        //修改 student01 的值类型字段
        student01.setAge(35);

        //修改 student01 的引用类型字段
        major.setMajorName("电子信息工程");
        major.setMajorId(2333);
        System.out.println(student01 == student02);
        System.out.println("=========================");
        System.out.println(student01);
        System.out.println(student02);
    }
}
结果:
false
=========================
Student{name='wangwu', age=22, major=Major{majorName='信息管理与信息系统', majorId=1003}}
Student{name='wangwu', age=22, major=Major{majorName='信息管理与信息系统', majorId=1003}}
=========================

深拷贝操作
false
=========================
Student{name='wangwu', age=35, major=Major{majorName='电子信息工程', majorId=2333}}
Student{name='wangwu', age=22, major=Major{majorName='信息管理与信息系统', majorId=1003}}

很明显,这时候student01和student02两个对象也是完全独立的,不受互相的干扰,深拷贝完成。


注:此文章只是学习过程中记录的笔记,如有错误,敬请指正。

Linux与Windows双系统,安装完linux后无法通过grub进入Windows的解决方法 先装Windows 10,Windows可正常启动,再装Kali,Kali提示装grub后照装。然而装完后重启发现无Windows选项。 阅读详情

相关推荐

JDK8升级JDK17过程中遇到的那些坑

JDK8虽然非常好,但是JDK版本已经发布到JDK20了,且JDK8后的版本升级了很多新的特性,如模块化、ZGC以及虚拟线程、结构性并发等,也是非常有吸引力的,所以决定将基于JDK8的项目升级到最近的LTS版本JDK17。

BASK2312的博客 6684

【Java面试】深拷贝、浅拷贝和引用拷贝三者的区别

本文讲解了什么是深拷贝、浅拷贝和引用拷贝以及它们三者之间的区别。

m0_75276797的博客 651

从分立到集成:深入解析Buck电路的核心模块与设计权衡

本文深入解析Buck电路的核心模块与设计权衡,从分立到集成方案的优缺点对比。详细探讨Buck电路的高效能量转换、小型化设计及灵活电压调节能力,并结合实际案例分享分立方案中的PWM生成、反馈环路设计及保护电路优化经验,为工程师提供实用设计参考。

weixin_29306317的博客 222

c++拷贝函数——深浅拷贝

拷贝构造函数 拷贝构造函数也是构造函数,长相和构造函数一样的,只是参数是固定 拷贝构造函数唯一的参数是对对象引用 不写拷贝构造函数,也存在一个默认的拷贝构造函数 拷贝构造函数作用: 通过一个对象去初始化另一个对象 思考问题 什么时候调用拷贝构造? 当通过一个对象去创建出来另一个新的对象时候需要调用拷贝 拷贝构造什么时候需要加const修饰参数? 当存在匿名对象赋值操作的时候,必须要const修饰

weixin_68269316的博客 5366

CANoe数据回放实战:如何用Replay Block精准复现实车故障(附ECU数据处理技巧)

本文深入探讨了利用CANoe的Replay Block功能进行数据回放,以精准复现实车偶发性故障的实战方法。文章重点解析了从原始OBD日志中移除目标ECU数据、转换报文方向等核心数据处理技巧,旨在帮助工程师重构真实的网络测试环境,从而高效定位并解决复杂的ECU问题。

nnn11的博客 495

VoLTE吞字断续优化方案

网络侧通过各节点探针的数据采集,能够进行RTP和RTCP包的分析,确定各节点的上行或下行丢包情况。1.基于测试语音分析,每2秒中大约8个字,每个字约10个RTP语音包。通话过程中,语音有短暂停顿,收音段听语音中会出现“吞字/断续现象”2.连续丢3~5个RTP以上就可能会出现吞字断续的感觉。下行评价的丢包问题,很难有效指导定界定位分析,无从下手。2.部分终端可能存在RTCP不反馈,导致无法获取丢包。1.语音包为UDP包,无反馈,终端无法判定是否丢包。终端可依据自身的调度反馈或弃包进行上行丢包判决。

m0_73503557的博客 1510

javascript 中的深度拷贝与浅拷贝

参考 【JS】深拷贝与浅拷贝的区别,实现深拷贝的几种方法 json.stringify()的妙用,json.stringify()与json.parse()的区别 今天在写小程序项目的时候遇到一个问题,数组的深拷贝与浅拷贝。 问题描述: 有一个页面,分了4个tab栏目,其中第一个页面得到原始数据companys做一个排序展示,每个company都有一个3项打分【从技术,市场和企业形象对企业...

暴躁兔子的记录 301

电压抬升电路设计

一、实验目的 掌握集成运放电压放大电路设计基本方法。 掌握基本仪器使用方法(电源、信号发生器、示波器)。 二、实验内容及结果 实验内容 基于集成运放设计一传感器信号采集电路。传感器输出信号在±50mV,频率为100Hz以内,模数转换器允许输入电压在0~5V,要求设计传感器与模数转换器之间的信号采集电路,实现传感器信号放大10倍,并适合模数转换器的输入。模数转换器的输入电阻为1KHz,设计电路时,可使用1KHz电阻作为信号采集电路负载,代替模数转换器。 实验具体要求如下: (1)确定电路形式,说明电压转

Safaearth的博客 4万+

OC中self.xxx和_xxx访问的区别,深拷贝和浅拷贝的区别

初学iOS时候,发现有的代码通过self.xxx访问,有时通过_xxx访问,一直搞不清楚有什么区别。其实,通过self.xxx是对属性进行访问,本质是调用属性的setter方法,引用计数器会+1;_xxx是直接对成员变量进行访问,是对指针的赋值,引用计数器没发生改变。下面,通过代码来看一下。 定义属性: @property (nonatomic, copy)NSStrin...

weixin_33827590的博客 191

Cadence psspxf实战:手把手教你仿真250MHz环形VCO的电源抑制比(附Verilog代码)

本文详细介绍了使用Cadence psspxf仿真器对250MHz环形VCO的电源抑制比(PSRR)进行仿真的全流程。从环形VCO的设计原理、Verilog代码实现,到Cadence环境配置、仿真参数设置,再到结果分析与优化技巧,提供了完整的实战指南。特别适合电路设计工程师学习如何评估和优化VCO的抗电源噪声能力。

weixin_42567752的博客 414

Python爬虫实战:如何通过解析JSON数据抓取抖音视频评论

本文介绍了如何使用Python爬虫抓取抖音视频评论数据。请求头伪造:通过使用随机的User-Agent,模拟真实用户的请求。代理池:使用代理IP来避免被封禁。JSON解析:直接从API接口获取JSON格式的数据,避免了动态加载内容的限制。需要注意的是,抓取网站数据时应遵守网站的爬虫协议,避免过度抓取影响网站性能或违反法律法规。希望本文能够帮助你掌握如何抓取和分析抖音视频评论数据!

2201_76125261的博客 3358

Python的浅拷贝把我坑惨了,原来copy()和deepcopy()的区别这么大

浅拷贝只复制表面,里面的东西还是共享的;深拷贝从头到尾全部复制,完全独立。赋值(b = a:给同一本书贴两个标签,撕掉一个另一个还在浅拷贝(copy():复印了书的封面,但里面的每一页还是原来那本深拷贝(deepcopy():把整本书从头到尾复印了一遍,崭新的一本现在我写代码但凡遇到嵌套数据结构要复制,都会停下来想一想:我到底要的是“复印封面”还是“复印全书”?想清楚再动手,少加两天班。

这家伙很懒,什么都没有留下 314

【CANdelaStudio编辑CDD】-21.2-创建OBD诊断$03,$07,$0A和$04服务以及OBD DTC

案例背景(共11页精讲):创建OBD诊断$03,$07,$0A和$04服务;以及OBD DTC。 在《【ISO15031_OBD诊断】-3.1-$03服务Request emission-related diagnostic trouble codes理论部分https://blog.youkuaiyun.com/qfmzhu/article/details/122157513》, 《【ISO15031_OBD诊断】-7.1-$07服务Request emission-related diagnostic trou

「汽车电子助手」的博客 1697

浅拷贝直接赋值_Python中的赋值与深浅拷贝

​在 Python 中,很多人常常搞不清楚赋值操作与深浅拷贝的区别,在实际使用是稍不注意可能产生意想不到的结果。本篇文章我们就来看一下 Python 中赋值与深浅拷贝的区别。1 赋值我们先来看一个示例:a = 1 b = a print(id(a)) print(id(b)) a = a + 1 print(id(a)) print(id(b)) # 输出 140704045741856 1407...

weixin_39696197的博客 97

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

python中array赋值_Python中的赋值与深浅拷贝

在 Python 中,很多人常常搞不清楚赋值操作与深浅拷贝的区别,在实际使用是稍不注意可能产生意想不到的结果。本篇文章我们就来看一下 Python 中赋值与深浅拷贝的区别。1 赋值我们先来看一个示例:a = 1b = aprint(id(a))print(id(b))a = a + 1print(id(a))print(id(b))# 输出140704045741856140704045...

weixin_29972227的博客 845

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

中print中加f_Python中的赋值与深浅拷贝

在 Python 中,很多人常常搞不清楚赋值操作与深浅拷贝的区别,在实际使用是稍不注意可能产生意想不到的结果。本篇文章我们就来看一下 Python 中赋值与深浅拷贝的区别。1 赋值我们先来看一个示例:a = 1b = aprint(id(a))print(id(b))a = a + 1print(id(a))print(id(b))# 输出140704045741856140704045...

weixin_39540315的博客 144

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

【JS】你还是搞不清楚原型,new,instanceof,this,执行上下文吗?

原型 每个函数都有 prototype 属性,除了 Function.prototype.bind(),该属性指向原型。 每个对象都有 __proto__ 属性,指向了创建该对象的构造函数的原型。其实这个属性指向了 [[prototype]],但是 [[prototype]] 是内部属性,我们并不能访问到,所以使用 _proto_ 来访问。 对象可以通过 __proto__ 来寻找不属于该对象的...

你若盛开,清风自来 419

Python入门知识有哪些 ?赋值与拷贝有什么差异?

ython入门知识有哪些?赋值与拷贝有什么差异?Python入门简单,对初学者非常友好,但仍然有很多同学表示学习有难度,比如常常搞不清楚赋值和拷贝。下面就给大家讲解一下赋值与拷贝的知识。   对于Python而言,Python的一切变量都是对象,变量的存储采用了引用语义的方式,存储的只是一个变量的值所在的内存地址,而不是这个变量的只本身。 赋值 Python中一切皆为对象,对象通过变量名进行引用,这里的变量名类似给对象贴标签,变量的赋值类似给对象贴标签,变量名就是对象的标签名。赋值操作(包括对象作为参数

Python_xiaobang的博客 265

python有什么赋值_Python入门知识有哪些 ?赋值与拷贝有什么差异?

ython入门知识有哪些?赋值与拷贝有什么差异?Python入门简单,对初学者非常友好,但仍然有很多同学表示学习有难度,比如常常搞不清楚赋值和拷贝。下面就给大家讲解一下赋值与拷贝的知识。   对于Python而言,Python的一切变量都是对象,变量的存储采用了引用语义的方式,存储的只是一个变量的值所在的内存地址,而不是这个变量的只本身。赋值Python中一切皆为对象,对象通过变量名进行引用,这里...

weixin_39610678的博客 112

N年Python老司机,血泪总结新手常见10大错误

作为python的新手,大家在上手python的时候都会或多或少的接触到一些rookie mistake,也就是菜鸟级别的错误。小编作为一个老司机也是从...

cainiao_python的博客 2630

python复制出现错误_N年Python老司机,血泪总结新手常见10大错误

原标题:N年Python老司机,血泪总结新手常见10大错误作为python的新手,大家在上手python的时候都会或多或少的接触到一些rookie mistake,也就是菜鸟级别的错误。小编作为一个老司机也是从这些错误中一点一点的积累经验,才慢慢的能够熟练的使用python。遇到错误不可怕,关键是要学会如何去避免犯这些错误。今天小编就带领大家看一下作为python新手最常见的几个错误,希望大家能够...

weixin_39804059的博客 559

js关于深度克隆问题

js的克隆是一个老生常谈的内容了,今天没啥好写的,就写这个了要搞清楚js的克隆,就需要先搞清楚js中的数据类型,js中数据类型分为两大类原始类型的拷贝确实相对简单,因为这些类型通常存储在栈上,这意味着它们在内存中占据的空间是固定的,并且可以直接通过指针进行复制。tips:如果你还搞不清楚什么是引用类型,什么是原始类型,可以看我的这篇文章然而,对于引用类型来说,拷贝则要复杂得多。引用类型的对象(例如数组或对象)存储在堆上,这意味着它们在内存中占据的空间是不固定的,并且由垃圾回收器管理。

JiuMeilove的博客 1万+

python容易出错的地方_N年Python老司机,血泪总结新手常见10大错误

作为python的新手,大家在上手python的时候都会或多或少的接触到一些rookie mistake,也就是菜鸟级别的错误。小编作为一个老司机也是从这些错误中一点一点的积累经验,才慢慢的能够熟练的使用python。遇到错误不可怕,关键是要学会如何去避免犯这些错误。今天小编就带领大家看一下作为python新手最常见的几个错误,希望大家能够在学习的过程中,尽量的去避免这些错误。1.默认可变对象上图...

weixin_39994949的博客 235

python代表性的编程语言_编程语言血泪总结新手常见10大错误

作为python的新手,大家在上手python的时候都会或多或少的接触到一些rookie mistake,也就是菜鸟级别的错误。小编作为一个老司机也是从这些错误中一点一点的积累经验,才慢慢的能够熟练的使用python。遇到错误不可怕,关键是要学会如何去避免犯这些错误。今天小编就带领大家看一下作为python新手最常见的几个错误,希望大家能够在学习的过程中,尽量的去避免这些错误。1.默认可变对象上图...

weixin_39876650的博客 107

python问题分享_【经验分享】7年Python老司机,血泪总结新手常见10大错误

作为python的新手,大家在上手python的时候都会或多或少的接触到一些rookie mistake,也就是菜鸟级别的错误。作为一个老司机也是从这些错误中一点一点的积累经验,才慢慢的能够熟练的使用python。遇到错误不可怕,关键是要学会如何去避免犯这些错误。今天小编就带领大家看一下作为python新手最常见的几个错误,希望大家能够在学习的过程中,尽量的去避免这些错误。1.默认可变对象上图中,...

weixin_40007548的博客 86
上一篇: 创建对象的方式
下一篇: CharSequence接口
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

窝在角落里学习

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值