Python编程学习——拷贝

简介:

这一篇博客主要讨论Python对象的拷贝问题,区分浅拷贝和深拷。为了保持追踪内存中的对象,Python使用了引用计数这一简单技术,下面将进行简单介绍。

1、引用计数:

当对象被创建并赋值给变量时,该对象的引用计数就被设置为 1 。当同一个对象又被赋值给其他变量时,或作为参数传给函数、方法或类实例时,或被赋值为一个窗口对象的成员时,该对象的一个新的引用(或称为别名)就被创建,该对象的引用计数加 1 。使用del关键字可以减少引用计数。

我们可以看到下面代码:

#!/usr/bin/env python
import sys
x = 3.14
print ‘x ‘, id(x), sys.getrefcount(x)
y = x
print ‘y ‘, id(y), sys.getrefcount(y)
z = 3.14
print ‘z ‘, id(z), sys.getrefcount(z)
del x
print ‘PI‘, id(3.14), sys.getrefcount(3.14)

输出如下:

x  34645712 4
y  34645712 5
z  34645712 6
PI 34645712 5

我们看到,虽然引用计数的变化情况与我们想象中一样,但是值却有点不一样,对于这种现象,Python官网给出了解释:

sys.getrefcount(object)
Return the reference count of the object. The count returned is generally one higher than you might expect, because it includes the (temporary) reference as an argument to getrefcount().

2、拷贝:

从前面我们可以知道,对象赋值其实是简单的对象引用,拷贝操作可以导入Python的copy模块并调用内置函数完成,具体见下面代码:

#!/usr/bin/env python
import copy

def print_(arg):
    print id(arg),arg,‘---‘,id(arg[2]),arg[2]

a = [‘123‘, ‘456‘, [123,456]]
b = a
c = copy.copy(a)
d = copy.deepcopy(a)
a.append(‘789‘); a[2].insert(2,789)     // 修改列表
print_(a); print_(b); print_(c); print_(d)

输出如下:

140694526889784 [‘123‘, ‘456‘, [123, 456, 789], ‘789‘] --- 140694526920680 [123, 456, 789]
140694526889784 [‘123‘, ‘456‘, [123, 456, 789], ‘789‘] --- 140694526920680 [123, 456, 789]
140694527025592 [‘123‘, ‘456‘, [123, 456, 789]] --- 140694526920680 [123, 456, 789]
140694526919672 [‘123‘, ‘456‘, [123, 456]] --- 140694527027464 [123, 456]

关于引用有下面几点注意事项:

1)非容器类型(比如数字,字符串和其他“原子”类型的对象,像代码、类型和xrange对象等)没有拷贝一说。

2)如果元组变量只包含原子类型对象,对它的深拷贝不会进行,即此时深拷贝也为浅拷贝。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-11-06 01:54:46

Python编程学习——拷贝的相关文章

Python编程学习,高效求解素数程序实例

素数是编程中经常需要用到的. 作为学习Python的示例,下面是一个高效求解一个范围内的素数的程序,不需要使用除法或者求模运算. 1 #coding:utf-8 #设置python文件的编码为utf-8,这样就可以写入中文注释 2 def primeRange(n): 3 myArray=[1 for x in range(n+1)] ##列表解析,生成长度为(n+1)的列表,每个数值都为1 4 myArray[0]=0 5 myArray[1]=0 6 startPos=2 7 while s

python编程学习进度一

以前自己写项目后台基本都是使用 Java语言来实现的,从来没有好好学习过Python语言,之前只做过相关的爬虫编程,并没有深入了解学习过.今天跳读了一本评价极好的书<Python编程从入门到实战>,以复习一下之前的 Python 基础.然后分析一下我学习的一些东西. Python解释器有两种,也就是说有两种方式执行Python代码——①交互式编程.②脚本式编程很多初始教程采用交互式编程这里借助 pycharm,采用脚本式编程. 1.数据类型 # 1.全体小写 print('Itaem'.low

python编程学习进度二

今天是学习python编程的第二天,今天仍然是看<Python编程从入门到实战>这本书,下面是主要学习的东西的总结 1.程序输入和raw_input()内建函数 从用户得到数据输入的最好方式使用raw_input()函数,它读取标准输入,并将读取到的数据赋值给指定的变量. 注释: 和大部分脚本及Unix-shell语言一样,python也使用 # 符号标示注释,从#开始直到一行结束的内容都是注释 操作符 和其他大多数语言一样,Python中的标准算数操作符以你熟悉的方式工作.加.减.乘.除.取

python编程学习进度四

今天自己写了 一个简单代码帮助自己理解python编程中的一些类的关系以及一些函数属性, 总结如下: 1,在python当中一切皆对象,每产生一个对象会对应三个属性:id.类型type和数值2,创建一个类就会创建一个类的名称空间,用来存储类中定义的所有名字,这些名字称为类的属性:而类中有两种属性:数据属性和函数属性,其中类的数据属性是共享给所有对象的,而类的函数属性是绑定到所有对象的. 3,在类的内部来说,__init__是类的函数属性,但是对于对象来说,就是绑定方法.4,命名空间的问题:先从对

Python编程学习之利用selenium分辨出可访问的网页并获取网页内容

一.前言 笔者在前面的文章中收集到一些域名,在这些域名收集完后,并不是每一个域名都有作用,我们要过滤掉访问不了的网站,所以今天学习利用Python中的selenium模块启动Chromium来请求网站,下面记录一下自己的学习过程. 二.学习过程 1.开发工具: Python版本:3.7.1 相关模块: selenium模块 pymysql模块 2.原理简介 从数据库读取出需要访问的域名------利用selenium进行访问域名并获取网站标题.内容长度.截图------存入数据库 from se

学习Python编程的11个资源

转自 http://blog.jobbole.com/71064/  用于以后学习备份 用 Python 写代码并不难,事实上,它一直以来都是被声称为最容易学习的编程语言.如果你正打算学习 web 开发,Python 是一个不错的选择,甚至你想学游戏开发也可 以从 Python 开始,因为用 Python 来构建游戏的资源实在是太多了.这是一种快速 学习语言的一种方法. 许多程序员使用 Python 作为初学语言,然后接着是像 PHP 和 Ruby 这样的语言.它也是2014最热门的 web 开

学习Python编程的11个精品资源

本文由 伯乐在线 - atupal 翻译自 Alex Ivanovs.欢迎加入技术翻译小组.转载请参见文章末尾处的要求. 用 Python 写代码并不难,事实上,它一直以来都是被声称为最容易学习的编程语言.如果你正打算学习 web 开发,Python 是一个不错的选择,甚至你想学游戏开发也可 以从 Python 开始,因为用 Python 来构建游戏的资源实在是太多了.这是一种快速 学习语言的一种方法. 许多程序员使用 Python 作为初学语言,然后接着是像 PHP 和 Ruby 这样的语言.

python基础学习05(核心编程第二版)部分

# -*- coding: utf-8 -*- # ==================== #File: python #Author: python #Date: 2014 #==================== __author__ = 'Administrator' #dict{键:值} #哈希 #注:字典是无顺序的,所以你懂的 #创建与赋值 dict1={} dict2={'name':'apply','avg':24,'sex':'man'} print dict1,dict2

《灰帽Python-黑客和逆向工程师的Python编程》学习记录

ctypes是Python语言的一个外部库,提供和C语言兼容的数据类型,可以很方便的调用C DLL中的函数. 操作环境:CentOS6.5 Python版本:2.66 ctypes是强大的,强大到本书以后介绍的几乎所有库都要基于此.使用它我们就能够调用动态链接库中函数,同时创建各种复杂的C数据类型和底层操作函数.毫无疑问,ctypes就是本书的基础. 第一章 搭建开发环境 1.3.2 使用动态链接库 from ctypes import * libc = CDLL("libc.so.6"