python中怎么复制代码_Python对象怎么引用_Python对象怎么复制代码_一聚教程网

本次文章要给大家讲解的是Python对象引用及复制代码,相信这也是大家问题比较大的一个点,下面为大家具体整理了操作过程,一起来了解下。

可以说Python没有赋值,只有引用。你这样相当于创建了一个引用自身的结构,所以导致了无限循环。为了理解这个问题,有个基本概念需要搞清楚。

Python没有「变量」,我们平时所说的变量其实只是「标签」,是引用。

python中,"a=b"表示的是对象a引用对象b,对象a本身没有单独分配内存空间(重要:不是复制!),它指向计算机中存储对象b的内存。因此,要想将一个对象复制为另一个对象,不能简单地用等号操作,要使用其它的方法。如序列类的对象是(列表、元组)要使用切片操作符(即':')来做复制。

在python进行像b = a这样的赋值时,只会创建一个对a的新引用,使a的引用计数加1,而不会创建新的对象:

>>> a = 'xyz'

>>> import sys

>>> sys.getrefcount(a)

3

>>> b = a

>>> sys.getrefcount(b)

4

>>> id(a)

88292288L

>>> id(b)

88292288L

这样,当引用的对象是可变对象的时候(列表,字典,可变集合等),会产生意料之外的行为:

>>> a = [1, 2, 3, 4]

>>> b = a

>>> b.append(5)

>>> a

[1, 2, 3, 4, 5]

因为a和b引用的是同一对象,改变其中一个,另外一个也会随之改变。当我们想建立一个副本而不是引用时,可以复制对象。

复制对象一般使用copy模块:

>>> a = [1, 2, 3, 4]

>>> import copy

>>> b = copy.copy(a)

>>> b.append(5)

>>> b

[1, 2, 3, 4, 5]

>>> a

[1, 2, 3, 4]

这样就可以了,但这种复制是一种浅复制,复制的新对象中包含的是对原始对象中的项的引用,如果对象的项为可变对象,也会产生不可控行为:

>>> a = [1, [1, 2]]

>>> b = copy.copy(a)

>>> b[1].append(3)

>>> b

[1, [1, 2, 3]]

>>> a

[1, [1, 2, 3]]

这时候就要使用深复制了。深复制将创建一个新对象,并递归地复制它所包含的所有对象:

>>> a = [1, [1, 2]]

>>> b = copy.deepcopy(a)

>>> b[1].append(3)

>>> b

[1, [1, 2, 3]]

>>> a

[1, [1, 2]]

对于不可改变的对象而言(字符串,数字,元组)等,没有必要拷贝,因为它们是不可改变的,不用担心会不经意间改动了它们。拷贝操作也只会得到原对象:

>>> a = (1, 2, 3)

>>> b = copy.copy(a)

>>> a is b

True

对于可变对象来(列表,字典,可变集合)来说,可以分别使用内置函数list(),dict(),set()来进行浅复制,速度是比使用copy模块快的。

列表也可以使用切片进行浅复制:

>>> a = [1, 2, 3, 4]

>>> b = a[:]

>>> a is b

False

>>> b

[1, 2, 3, 4]

对序列数据类型(字符串,列表,元组)进行*操作时,也仅仅是复制了对象中项的引用,如果使用*创建一个多维列表:

>>> a = [1, 2, 3]

>>> b = [a]

>>> c = b * 3

>>> a.append(4)

>>> c

[[1, 2, 3, 4], [1, 2, 3, 4], [1, 2, 3, 4]]

最好是在列表推导中使用浅复制来创建多维列表,可以避免隐式的引用共享:

>>> a = [1, 2, 3]

>>> c = [list(a) for i in range(3)]

>>> a.append(4)

>>> c

[[1, 2, 3], [1, 2, 3], [1, 2, 3]]

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/472589.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python为什么是蟒蛇_Python 为什么推荐蛇形命名法?

关于变量的命名,这又是一个容易引发程序员论战的话题。如何命名才能更具有可读性、易写性与明义性呢?众说纷纭。 本期“Python为什么”栏目,我们将聚焦于变量命名中的连接方式,来切入这块是非之地,想要回答的问题是——…

可视化工具Navicat for MySQL-操作三

五、备份和还原MySQL数据库 在数据库的管理中,备份和还原是必须做认真做的事情,如果疏忽或者做粗糙了,那么一旦数据库故障后果不堪设想,所以Navicat同样也有备份和还原的功能,相比较创建功能,其备份功能则…

python mysql返回,python操作mysql数据-执行语句返回值直接返回字典类型

fetchall()将结果放在二维数组里面,每一行的结果在元组里面import pymysqldef export(table_name):conn pymysql.connect(host 118.24.3.40,user jxz,password,dbjxz,port3306,charset utf8)cur conn.cursor()cur.execute(select * from %s%table_name)print(cu…

如何在python中打开文件_Python文件处理:创建、打开、追加、读、写

在Python中,不需要导入外部库来读取和写入文件。Python为创建、写入和读取文件提供了内置的函数。 在本文中,我们将学习 如何创建文本文件 如何将数据附加到文件中 如何读取文件 如何逐行读取文件 Python中的文件模式 如何创建文本文件 使用Python&#…

python中response.text_Sanic response text() 函数用法和示例

response.text() 功能:Sanic 返回纯文本内容给浏览器。作为一个完整功能的web网站,一般是不会返回纯文本内容的,特殊情况下可选择使用本函数。response.text() 语法def text(body,status200, headersNone,content_type"text/plain;chars…

天池 在线编程 排名查询

文章目录1. 题目2. 解题1. 题目 描述 给一个二维数组scores表示每个学生的各科成绩&#xff0c;求出学生中总成绩排名第K的索引。 如果成绩一样&#xff0c;越早出现的排名越高。 0 < scores[i][j] < 100 示例&#xff1a; 输入: scores: [[90, 80, 70], [90, 90, 90],…

matlab处理亮度不均匀,校正亮度不均匀问题并分析前景对象

预处理图像将图像读入工作区。I imread(rice.png);imshow(I)图像中心的背景亮度比底部亮度高。预处理图像&#xff0c;使背景亮度更加均匀。第一步&#xff0c;使用形态学开运算删除所有前景(米粒)。开运算会删除无法完全包含结构元素的小对象。定义半径为 15 的盘形结构元素&…

[CentOS] 打造vim环境

安装vim yum install vim-enhanced 安装git rpm -Uvh http://mirrors.ustc.edu.cn/fedora/epel/6/x86_64/epel-release-6-8.noarch.rpmyum install git 安装bundle插件 git clone https://github.com/gmarik/vundle.git /data/vim/bundle/vundle 配置vim vim /etc/vimrc 在文件…

python接活网站_python能自己接活_python开发接活 - CSDN

Python远程连接oracle数据库概要1。Python连接数据库代码:def oracledbConnect(自我):试题:康涅狄格州 cx_ (\u201Cmdm\u201D、\u201Cnetqin123\u201D,\u201C: 1521 \/敏捷\u201D)光标 ()(\u201Cselect * from t_user \直接安装oracle数据库客户端:安装win32_11gR2_。4. 安装in…

python调用metasploit自动攻击_Python实现远程调用MetaSploit的方法

本文较为详细的讲述了Python实现远程调用MetaSploit的方法&#xff0c;对Python的学习来说有很好的参考价值。具体实现方法如下&#xff1a;(1)安装Python的msgpack类库&#xff0c;MSF官方文档中的数据序列化标准就是参照msgpack。rootkali:~# apt-get install python-setupto…

oracle 02085,OracleDBLink创建和维护以及ORA-02085解决办法

今天业务需要&#xff0c;要跨库查询Oracle数据&#xff0c;于是想到了dblink, 下面一一细说&#xff0c;Oracle DBLink。今天业务需要&#xff0c;要跨库查询Oracle数据&#xff0c;于是想到了dblink, 下面一一细说&#xff0c;&#xff0c;Oracle DBLink。首先Oracle DBLink …

C#单例模式详解

C#要实现单例模式必须要有以下三点&#xff1a; 声明私有静态成员、私有化构造函数、静态函数返回实例。 private static GameManager s_GameManagernull;private GameManager(){}public static GetInstance(){if(!s_GameManager){s_GameManagernew GameManager();}return s_Ga…

python的使用说明_Python 的基本使用说明

#-*- coding: utf-8 -*-#/usr/bin/env python Python中默认的编码格式是 ASCII 格式&#xff0c;在没修改编码格式时无法正确打印汉字&#xff0c;所以在读取中文时会报错。 解决方法为只要在文件开头加入 # -*- coding: UTF-8 -*- 或者 #codingutf-8 就行了 #导入模块 cnf#imp…

notepad python设置_NotePad++上配置Python

1.安装好python以及notepad2.打开notepad点击"运行"菜单->"运行"按钮(或者直接按F5)在弹出的窗口内输入以下命令(命令解释见文尾)后点击“保存”&#xff1a;cmd /k cd /d "$(CURRENT_DIRECTORY)" & python "$(FULL_CURRENT_PATH)&q…

oracle将字段nullable设为Y,从DB模型中消除NULLable列的选项(为了避免SQL的三值逻辑)?...

不久之前,我一直在阅读SQL and Relational Theory by C. J. Date一书.作者因批评sql的三值逻辑(3VL)而闻名.1)作者强调了为什么在sql中应该避免使用3VL,但他没有概述如果不允许使用可空列的数据库模型的样子.我已经考虑了一下,并提出了以下解决方案.如果我错过了其他设计方案,我…

在Delphi中使用indy SMTP发送gmail邮件[转]

在Delphi中使用indy SMTP发送gmail邮件[转] 2012-01-01 22:44:30| 分类&#xff1a; Delphi | 标签&#xff1a; |举报 |字号大中小 订阅 在Delphi中发送email很简单&#xff0c;发送ssl方式的gmail邮件也很简单&#xff0c;只要在使用的idSMTP上附加一个TIdSSLIOHandlerS…

LeetCode 1797. 设计一个验证系统(map)

文章目录1. 题目2. 解题1. 题目 你需要设计一个包含验证码的验证系统。 每一次验证中&#xff0c;用户会收到一个新的验证码&#xff0c;这个验证码在 currentTime 时刻之后 timeToLive 秒过期。 如果验证码被更新了&#xff0c;那么它会在 currentTime &#xff08;可能与之前…

git add remote_使用git管理嵌入式软件版本

点击上方蓝字关注我哦&#xff5e;你现在的Keil工程的版本控制是怎么管理的&#xff1f;可能有些人的做法是发布一个版本软件后将代码打一个包保存起来&#xff0c;作为此版本的备份。有一种常见的情况&#xff0c;当开始一项新功能的开发&#xff0c;并且最终的效果不理想老板…

xshell 6 连接debian系统拒绝了密码_Xshell中操作Linux的常用命令,你知道几个?

作为IT人员&#xff0c;想必都知道Linux是一套免费使用和自由传播的类Unix操作系统&#xff0c;是一个基于POSIX和UNIX的多用户、多任务、支持多线程和多CPU的操作系统。Xshell作为专业的终端模拟器&#xff0c;可以用来登录Linux&#xff0c;从而通过命令来控制Linux系统&…

PHP允许输入负数,php exec在linux中返回值不能为负数

php exec在linux中返回值不能为负数有需要的朋友可参考一下。我们先来了解一下关于exec函数的使用方法exec()原型&#xff1a; 代码如下复制代码string exec (string command [, string array [, int return_var]])exec ()函数与system()类似&#xff0c;也执行给定的命令&…