字典拷贝python
很多同学在进行编程学习时缺乏系统学习的资料。本页面基于字典拷贝python内容,从基础理论到综合实战,通过实用的知识类文章,标准的编程教程,丰富的视频课程,为您在字典拷贝python相关知识领域提供全面立体的资料补充。同时还包含 zabbix、zepto、zipentry 的知识内容,欢迎查阅!
字典拷贝python相关知识
-
Python深拷贝和浅拷贝解析概述本文涉及到主要的概念有:变量(名)引用对象可变对象和不可变对象拷贝深拷贝和拷贝正文像Java,Python这样的语言,存在着深拷贝,浅拷贝的问题。下面我们先通过一张图来看看变量和对象的关系:变量和对象的关系对象和变量我们要明确以下概念:变量 是系统变量名表中的元素(可以想象成人的名字)对象 是计算机分配的一块内存,需要足够的空间去表示它的值(可以想象成真正的人)引用 是 自动形成的从变量到对象的 指针(给人对象取人名变量名)如果不清楚动态类型变量的概念,可以看一下下面的总结:Python的变量创建过程是在代码第一次给他赋值就创建了变量,之后的赋值 会改变已经创建的变量名的值Python的变量是没有类型的,变量是通用的,只是在一个特定的时间点,引用了一个特定的对象Python中 使用变量的时候,当变量出现在表达式中时,它会马上被所引用的对象所替代。当然,使用没赋值的变量会产生错误在Python中,对象按照可变不可变分为可变对象和不可变对象:可变对象 指 可以在原处修改,而不用创建新的对象(包括列表,字典,
-
python 深拷贝和浅拷贝区别 浅拷贝 拷贝的是引用, 所有对象都会指向此地址 , 对这个内存地址的改动,都会影响 到引用到这个对象 深拷贝 拷贝的是值 , 内存地址变成 , 值复制到新的对象内存地址上 Python中对象的赋值都是进行对象引用(内存地址)传递 使用copy.copy(),可以进行对象的浅拷贝,它复制了对象,但对于对象中的元素,依然使用原始的引用. 如果需要复制一个容器对象,以及它里面的所有元素(包含元素的子元素),可以使用copy.deepcopy()进行深拷贝 对于非容器类型(如数字、字符串、和其
-
【python测试开发栈】—理解python深拷贝与浅拷贝的区别内存的浅拷贝和深拷贝是面试时经常被问到的问题,如果不能理解其本质原理,有可能会答非所问,给面试官留下不好的印象。另外,理解浅拷贝和深拷贝的原理,还可以帮助我们理解Python内存机制。这篇文章将会通过一些例子,来验证内存拷贝的过程,帮助大家理解内存拷贝的原理。 Python3中的数据类型 我们首先得知道Python3中的数据被分为可变类型和不可变类型 可变类型:Number(数字)、String(字符串)、Tuple(元祖) 不可变类型:List(列表)、Dictionary(字典)、Set(集合) 对于可变类型和不可变
-
python深拷贝与浅拷贝可变对象与不可变对象要理解深拷贝和浅拷贝,首先要理解可变对象和不可变对象。不可变对象:该对象所指向的内存中的值不能被改变,修改对象的值时,由于其指向的值不能被改变,因此实际上是在内存中重新开辟一个地址用来存储新的值,然后将对象指向这个新值。本质上是两个对象,赋值前后对象id发生了变化。python中的不可变对象包括:bool、int、str、float、tuple、frozenset、None。可变对象:该对象所指向的内存中的值可以被改变。变量(引用)的值发生改变时,实际上是其指向的值直接发生改变,没有开辟新的内存地址。python中的可变对象包括:list、dict、set。 python中的赋值语句不会创建对象的拷贝,仅仅只是将变量名称绑定到一个对象上。对于不可变对象,这种操作不会产生差别,但是处理可变对象或可变对象的集合时,你可能希望创建这些对象的“真实拷贝”,在修改创建的拷贝时不改变原始的对象。浅拷贝:通常指构造一个新的集合对象,然后用原始对象中的找到的子对象的引用来填充它。浅层的复制只有
字典拷贝python相关课程
字典拷贝python相关教程
- 2.2 字面量对象拷贝 上面说到了 ES5 和 ES6 数组拷贝的一个对比,那么针对字面量对象的拷贝二者又是怎么来实现的呢?ES5 中针对字面量对象的拷贝方式比较少,没有数组提供的类似的方法可以使用,只能使用循环,但是还可以使用 JSON.stringify 和 JSON.parse 来实现,但是这个方法存在一些缺陷。 下面看 ES5 中字面量的拷贝实例:let obj = {a: 1, b: 2};let copy1 = {};for(let key in obj) { copy1[key] = obj[key] }let copy2 = JSON.parse(JSON.stringify(obj))上面的两种方法给出了 ES5 拷贝字面量对象的方法,比较麻烦,也容易出错。ES6 给出了它的答案:let obj = {a: 1, b: 2};let copy = {...obj};使用展开语法对 obj 进行展开,完美地实现了拷贝过程。Tips: 这里有必要说明一下,以上的方法都是浅拷贝(只拷贝数组和对象的第一层结构)的过程,对于数组和对象第一层以后的内容,如果是引用类型的存储方式,则不会进行拷贝操作,也就是不会进行深拷贝。
- 3. 浅拷贝 Object.assign() 的拷贝属于浅拷贝,也就是说它只拷贝对下的第一层的属性值。如果这个值是一个对象类型,那么 Object.assign() 不会对该对象进行深拷贝,也就是说,拷贝后的对象下的这个对象类型是源对象和拷贝后的对象共有的,无论谁(源对象或拷贝后对象)对这个对象下的值进行修改,另一个对象(源对象或拷贝后对象)也会共享这个改变。看下面的例子更清晰的表达:var target = {};var source = {a: 1, b: {c: 2, d: 3}};Object.assign(target, source);target.a = 5;target.b.c = 9;console.log(target) // {a: 5, b: {c: 9, d: 3}}console.log(source) // {a: 1, b: {c: 9, d: 3}}上面的代码中,源对象 source 是个两层的字面量对象,b 也是一个对象。使用 Object.assign() 拷贝给目标对象 target,拷贝后对 target 对象下的值进行修改,然后打印目标对象和源对象。从打印的结果可以看出,对 target 第一层的 a 进行修改时,源对象是不会改变。但是对 target 下的 b 对象下的值进行修改时,因为 b 也是一个对象,所以源对象中的值也被修改了。到这里可以看出,Object.assign() 没有对 b 进行拷贝。如果需要深拷贝则需要,需要递归地使用去 Object.assign() 来拷贝对象。
- 2.1 数组拷贝 在 ES5 经常会遇到数组和对象的浅拷贝,我们都知道数组和对象都是引用类型,所以不能像字符串那样直接赋值,在 ES5 中数组和对象的拷贝都是通过循环来实现的,下面我们来看几个例子:var arr1 = [1, 2, 3];var arr2 = [];arr1.forEach(function(value){ arr2.push(value);}) console.log(arr2); // [1, 2, 3]上面的代码是把 arr1 数组中的项拷贝到 arr2 中去,还可以使用数组提供的 concat 和 slice 方法来实现。var arr1 = [1, 2, 3];var arr2 = [].concat(arr1);var arr3 = arr1.slice(0);arr1.push(4)console.log(arr1); //[1, 2, 3, 4]console.log(arr2); //[1, 2, 3]console.log(arr3); //[1, 2, 3]在拷贝完后,对 arr1 数组添加元素,可以看到 arr2 和 arr3 没有发生变化,说明它们不是一个引用地址。这是 ES5 所提供的拷贝方式,那么 ES6 是如何简化的呢?var arr1 = [1, 2, 3]; var arr2 = [...arr1];arr1.push(4)console.log(arr1); //[1, 2, 3, 4]console.log(arr2); //[1, 2, 3]使用 ... 展开语法可以实现与上面 ES5 实现的相同效果,而且比较简洁地表达了把 arr1 中的每一项展开放入 arr2 中。
- 5. 拷贝异常时会被打断 在拷贝时如果发生异常,则拷贝会被终止,并报错,前面已经被拷贝的不会被影响可以继续使用,但后面没有被拷贝的则不能被使用。var target = Object.defineProperty({}, "a", { value: 1, writable: false});Object.assign(target, {b: 2}, {a: 3}, {c: 4});// Uncaught TypeError: Cannot assign to read only property 'a' of object 'console.log(target.b); // 2console.log(target.c); // undefined上面的代码中,定义了目标对象 target 上的属性 a 是只读的,也就是不能不被修改,在合并代码时,源对象上有 a,则报了 a 是对象上的只读属性不能被 assign 操作。从后面的打印结果可以看出,b 已经被拷贝到目标对象上了可以正常使用,但由于拷贝中发生异常,最后一个对象没有被拷贝,所以 c 的值是 undefined。
- 2.2 拷贝对象 let target = {};let source = {a: 1, b: 2, c: 3};Object.assign(target, source);target.d = 4;console.log(target) // {a: 1, b: 2, c: 3, d: 4}console.log(source) // {a: 1, b: 2, c: 3}上面的代码可以看出,Object.assign () 的主要用法就是把源对象拷贝到指定的对象上去,目标对象的更改不会影响源对象。
- 3.1 深拷贝 可以配合 JSON 的两个方法,对对象进行深拷贝。var obj = {prop: 'value'};var newObj = JSON.parse(JSON.stringify(obj));newObj.prop = 'new value';console.log(obj);console.log(newObj);根据结果可以看到新的对象修改,没有影响到原对象,两者之间不存在引用关系。
字典拷贝python相关搜索
-
z index
zabbix
zepto
zipentry
zookeeper
在线编辑
在线编辑器
整型常量
正则表达式
正则表达式教程
正则不包含
指示器
指针变量
指针初始化
指针的指针
指针函数
指针数组
转义字符
自学教程
字符常量