拷贝

python进阶----深拷贝&浅拷贝

南楼画角 提交于 2020-01-17 19:35:05
复制需要区分,,复制的是源文件的数据,还是指向源文件数据的地址 1.引用 b=a时,理解为b指向了a指向的数据,相当于引用复制 a=[1,2] b=a #验证复制的是数据还是地址 #1.查看ab的地址 id(a) #2677646858824 id(b) #2677646858824#2. a增加1个元素,查看b是否增加a.append(3)a #[1,2,3]b #[1,2,3]  2. 浅拷贝--copy.copy() import copy a=[1,2] b=[3,4] c=[a,b] d=copy.copy(c) #验证问题1:d是否执行c地址 #验证方法1 id(d) #2677647114120 id(c) #2677644514824 #验证方法2 c.append(6) c #[[1, 2], [3, 4], 6] d #[[1, 2], [3, 4]] 结论:d没有指向c的地址 验证问题2:d执行a,b的地址,还是只是复制了a,b的值 #验证方法1 id(d[0]) #2677647113672 id(c[0]) #2677647113672 #验证方法2 a.append(5) c #[[1, 2, 5], [3, 4]] d #[[1, 2, 5], [3, 4]] 结论:,d中的a与c中的a,地址相同,说明d中的a,与c中的a均指向a的地址的  

【一篇入魂】网络编程中的五种IO模型

点点圈 提交于 2020-01-16 14:35:22
我们在进行编程开发的时候,经常会涉及到同步,异步,阻塞,非阻塞,IO多路复用等概念,这几个概念有区别,但是有时候也容易混淆,如果不总结一下的话很容易受到困扰,下面就记录一下这几个概念的理解。 Unix网络编程中的五种IO模型 Blocking IO - 阻塞IO NoneBlocking IO - 非阻塞IO IO multiplexing - IO多路复用 signal driven IO - 信号驱动IO asynchronous IO - 异步IO 由于 signal driven IO 在实际使用中并不常用,所以这里只讨论剩下的四种IO模型。 在讨论之前先说明一下IO发生时涉及到的对象和步骤,对于一个network IO,它会涉及到两个系统对象: application 调用这个IO的进程 kernel 系统内核 那他们经历的两个交互过程是: 阶段1 wait for data 等待数据准备 阶段2 copy data from kernel to user 将数据从内核拷贝到用户进程中 之所以会有同步、异步、阻塞和非阻塞这几种说法就是根据程序在这两个阶段的处理方式不同而产生的。了解了这些背景之后,我们就分别针对四种IO模型进行讲解。 Blocking IO - 阻塞IO 在linux中,默认情况下所有的socket都是blocking,一个典型的读操作流程大概如下图:

shutil 模块

荒凉一梦 提交于 2020-01-16 05:15:36
高级的 文件、文件夹、压缩包 处理模块 shutil.copyfileobj(fsrc, fdst[, length]) 将文件内容拷贝到另一个文件中 import shutil shutil.copyfileobj(open('old.xml','r'), open('new.xml', 'w')) shutil.copyfile(src, dst) 拷贝文件 shutil.copyfile('f1.log', 'f2.log') #目标文件无需存在 shutil.copymode(src, dst) 仅拷贝权限。内容、组、用户均不变 shutil.copymode('f1.log', 'f2.log') #目标文件必须存在 shutil.copystat(src, dst) 仅拷贝状态的信息,包括:mode bits, atime, mtime, flags shutil.copystat('f1.log', 'f2.log') #目标文件必须存在 shutil.copy(src, dst) 拷贝文件和权限 import shutil shutil.copy('f1.log', 'f2.log') shutil.copy2(src, dst) 拷贝文件和状态信息 import shutil shutil.copy2('f1.log', 'f2.log') shutil

python深浅拷贝

…衆ロ難τιáo~ 提交于 2020-01-16 05:13:39
现在,大家先不要理会什么是深浅拷贝,听我说,对于一个列表,我想复制一份怎么办呢? 肯定会有同学说,重新赋值呗: 1 2 names_class1 = [ '张三' , '李四' , '王五' , '赵六' ] names_class1_copy = [ '张三' , '李四' , '王五' , '赵六' ] 这是两块独立的内存空间 这也没问题,还是那句话,如果列表内容做够大,你真的可以要每一个元素都重新写一遍吗?当然不啦,所以列表里为我们内置了copy方法: 1 2 3 4 5 6 7 8 9 10 11 12 13 names_class1 = [ '张三' , '李四' , '王五' , '赵六' ,[ 1 , 2 , 3 ]] names_class1_copy = names_class1.copy() names_class1[ 0 ] = 'zhangsan' print (names_class1) print (names_class1_copy) ############ names_class1[ 4 ][ 2 ] = 5 print (names_class1) print (names_class1_copy) #问题来了,为什么names_class1_copy,从这一点我们可以断定,这两个变量并不是完全独立的,那他们的关系是什么呢?为什么有的改变

Java NIO(一):零拷贝

半世苍凉 提交于 2020-01-16 05:07:34
什么是零拷贝 维基上是这么描述零拷贝的:零拷贝描述的是CPU不执行拷贝数据从一个存储区域到另一个存储区域的任务,这通常用于通过网络传输一个文件时以减少CPU周期和内存带宽。 零拷贝给我们带来的好处 减少甚至完全避免不必要的CPU拷贝,从而让CPU解脱出来去执行其他的任务 减少内存带宽的占用 通常零拷贝技术还能够减少用户空间和操作系统内核空间之间的上下文切换 零拷贝的实现 零拷贝实际的实现并没有真正的标准,取决于操作系统如何实现这一点。零拷贝完全依赖于操作系统。操作系统支持,就有;不支持,就没有。不依赖Java本身。 传统I/O 在Java中,我们可以通过InputStream从源数据中读取数据流到一个缓冲区里,然后再将它们输入到OutputStream里。我们知道,这种IO方式传输效率是比较低的。那么,当使用上面的代码时操作系统会发生什么情况: 1. JVM发出read() 系统调用。 2. OS上下文切换到内核模式(第一次上下文切换)并将数据读取到内核空间缓冲区。(第一次拷贝:hardware —-> kernel buffer) 3. OS内核然后将数据复制到用户空间缓冲区(第二次拷贝: kernel buffer ——> user buffer),然后read系统调用返回。而系统调用的返回又会导致一次内核空间到用户空间的上下文切换(第二次上下文切换)。 4.

JS堆栈与拷贝

二次信任 提交于 2020-01-16 04:33:08
一.堆栈的定义 1.栈是一种特殊的线性表。其特殊性在于限定插入和删除数据元素的操作只能在线性表的一端进行。 结论:后进先出(Last In First Out),简称为LIFO线性表。栈的应用有:数制转换,语法词法分析,表达式求值等 2.队列(Queue)也是一种运算受限的线性表,它的运算限制与栈不同,是两头都有限制,插入只能在表的一端进行(只进不出),而删除只能在表的另一端进行(只出不进),允许删除的一端称为队尾(rear),允许插入的一端称为队头 (Front),队列的操作原则是先进先出的,所以队列又称作FIFO表(First In First Out)。 由于栈和队列也是线性表,栈和队列有顺序栈和链栈两种存储结构,这两种存储结构的不同,则使得实现栈的基本运算的算法也有所不同。 二.JS堆栈研究 1、栈(stack)和堆(heap) stack为自动分配的内存空间,它由系统自动释放;而heap则是动态分配的内存,大小不定也不会自动释放。 2、基本类型和引用类型 (1) 基本类型 :存放在栈内存中的简单数据段,数据大小确定,内存空间大小可以分配。 5种基本数据类型有Undefined、Null、Boolean、Number 和 String,它们是直接按值存放的,所以可以直接访问。 (2) 引用类型 :存放在堆内存中的对象,变量实际保存的是一个指针,这个指针指向另一个位置

Java浅拷贝和深拷贝的区别

旧城冷巷雨未停 提交于 2020-01-15 08:53:22
浅拷贝和深拷贝的区别 浅拷贝和深拷贝都是复制对象, 复制出来的对象,它们的内存地址都是重新分配的 ,区别在于 浅拷贝对象中的引用类型和原对象中的引用类型指向同一个内存地址 ,而 深拷贝对象中的引用类型的内存地址是重新分配的 ,也就是说, 浅拷贝对象和原对象的引用类型的数据是同步的,深拷贝对象和原对象的引用类型的数据是互不干扰的 。 注意: 这里说的是引用类型 !对于对象中直接定义的 基本数据类型及其包装类型、 String 类型 这些数据类型, 由于原对象和拷贝对象的内存地址是重新分配的,因此这些数据的改变不会影响到另一个对象 。 注意: 再强调一次,请区分对象中的 基本数据类型及其包装类型、 String 类型 ,这些不属于引用类型!特别要注意的是, 浅拷贝中,对象中的引用类型的地址是同一个内存地址 ,引用类型中的 基本数据类型及其包装类型、 String 类型 的改变会同步到所有浅拷贝对象及原对象中! 浅拷贝的实现 方法一:类要实现 Cloneable 接口,重写 Object 的 clone 方法,在 clone 方法中调用 super.clone() 方法即可。 方法二:只要能实现一个对象的所有属性都拷贝到另一个新对象的属性中即可,通常使用方法一 public class ShallowCopy implements Cloneable { public

java对象拷贝和复制

空扰寡人 提交于 2020-01-15 06:49:39
参考文章:http://blog.csdn.net/XIAXIA__/article/details/41652057 解决问题:深拷贝、浅拷贝 和普通的对象赋值有什么区别? 对象复制 例如:Person p2 = p1;实质就是对象地址复制。把p1地址赋值给p2。此时二者同时指向一块堆内存,所以改变p1的属性值之后,p2所对应的属性值也会跟着变化。 例如有一个如下所示的Person类: 1 package tudou.javabasic.clone; 2 3 class Person { 4 private int age; 5 private String name; 6 private Address address; 7 8 public Address getAddress() { 9 return address; 10 } 11 12 public void setAddress(Address address) { 13 this.address = address; 14 } 15 16 public Person(int age, String name) { 17 this.age = age; 18 this.name = name; 19 } 20 21 public int getAge() { 22 return age; 23 } 24 25

qt实现目录拷贝

僤鯓⒐⒋嵵緔 提交于 2020-01-14 18:01:03
/** CopyDirectory -- 拷贝目录 fromDir : 源目录 toDir : 目标目录 bCoverIfFileExists : ture:同名时覆盖 false:同名时返回false,终止拷贝 返回: ture拷贝成功 false:拷贝未完成 */ bool CopyDirectory ( const QDir & fromDir , const QDir & toDir , bool bCoverIfFileExists ) { //以下解压方式失败 //QZipReader zipReader(fromDir.absolutePath() + ".zip"); //return zipReader.extractAll(toDir.absolutePath()); //以下拷贝方式未拷贝权限信息,运行时错误不明。手动拷贝可行。 QDir formDir_ ( fromDir ) ; QDir toDir_ ( toDir ) ; if ( ! toDir_ . exists ( ) ) { if ( ! toDir_ . mkdir ( toDir . absolutePath ( ) ) ) return false ; } QFileInfoList fileInfoList = formDir_ . entryInfoList ( ) ;

C++深拷贝与浅拷贝

早过忘川 提交于 2020-01-14 03:41:31
转自: http://www.cnblogs.com/BlueTzar/articles/1223313.html 对于普通类型的对象来说,它们之间的复制是很简单的,例如: int a=88; int b=a; 而类对象与普通对象不同,类对象内部结构一般较为复杂,存在各种成员变量。下面看一个类对象拷贝的简单例子。 #include <iostream> using namespace std; class CExample { private:  int a; public:  CExample(int b)  { a=b; }  void Show ()  { cout<<a<<endl; } }; int main() {  CExample A(100);  CExample B=A;  B.Show ();  return 0; } 运行程序,屏幕输出100。从以上代码的运行结果可以看出,系统为对象B分配了内存并完成了与对象A的复制过程。就类对象而言,相同类型的类对象是通过拷贝构造函数来完成整个复制过程的。下面举例说明拷贝构造函数的工作过程。 #include <iostream> using namespace std; class CExample { private: int a; public: CExample(int b) { a=b;} CExample