Python中List的append引用赋值问题处理

Python中的对象之间赋值时是按引用传递的,如果需要拷贝对象,需要使用标准库中的copy模块。

1. copy.copy 浅拷贝 只拷贝父对象,不会拷贝对象的内部的子对象。

2. copy.deepcopy 深拷贝 拷贝对象及其子对象程序:

import copy
a = [1, 2, 3, 4, [‘a‘, ‘b‘]] #原始对象  

b = a #赋值,传对象的引用
c = copy.copy(a) #对象拷贝,浅拷贝
d = copy.deepcopy(a) #对象拷贝,深拷贝  

a.append(5) #修改对象a
a[4].append(‘c‘) #修改对象a中的[‘a‘, ‘b‘]数组对象  

print ‘a = ‘, a
print ‘b = ‘, b
print ‘c = ‘, c
print ‘d = ‘, d 

输出结果:

a = [1, 2, 3, 4, [‘a‘, ‘b‘, ‘c‘], 5]
b = [1, 2, 3, 4, [‘a‘, ‘b‘, ‘c‘], 5]
c = [1, 2, 3, 4, [‘a‘, ‘b‘, ‘c‘]]
d = [1, 2, 3, 4, [‘a‘, ‘b‘]]

时间: 2024-11-04 18:28:54

Python中List的append引用赋值问题处理的相关文章

Python中的深浅拷贝,赋值及引用

简单来说,若对象a中存的是列表或字典等可变对象,b对a的浅拷贝只是对对象第一层的复制,修改b第二层的元素仍然会影响两个对象. 深拷贝则是不会影响原来的对象. import copy.copy() 浅拷贝 copy.deepcopy()  深拷贝 赋值操作更像是一个引用,新的赋值会创建一个新的内存地址,指向改变了,原来的内存地址还会存在. 参考文章地址: python基础(5):深入理解 python 中的赋值.引用.拷贝.作用域 http://my.oschina.net/leejun2005/

Python中的传值和引用

我写这个主要是给自己看,内容也就是便于自己理解,可能会不正确,但目前来看代码测试的结果是对的. python中一切皆对象. 当我们赋值时: a = 1 其实是先创建了一个整数常量1(也是一个对象,且已经为它分配了内存),然后将它的地址传递给了a 当我们将a的值赋值给b时: b = a ,其实也是将1的地址传递给了b 接下来查看a和b的地址 id(a) id(b) 会发现两者相同 所以如果执行 a = 2 ,a的地址就会改变,再执行 a = 1 之后,a的地址又会变成原来的值 而当操作自己定义的c

Python中的对象的拷贝赋值操作

Python中的赋值也分传值与传地址. 用=时,传的是地址,当两者绑定到一起,其中一个发生改变时,另一个也会改变. 如: x = [1, 2, 3, 4] y = x y[0] = 5 print(x) 这时候的结果显示的是 [5, 2, 3, 4] 若要仅仅传值,则要用copy函数. x = [1, 2, 3, 4] y = x.copy() y[0] = 5 print(x) 这时候的结果就显示的是 [1, 2, 3, 4],即x的值没有改变.

python中函数参数的引用方式

值传递和引用传递时C++中的概念,在python中函数参数的传递是变量指向的对象的物理内存地址!!! python不允许程序员选择采用传值还是传引用.Python参数传递采用的肯定是"传对象引用"的方式.这种方式相当于传值和传引用的一种综合.如果函数收到的是一个可变对象(比如字典或者列表)的引用,就能修改对象的原始值--相当于通过"传引用"来传递对象.如果函数收到的是一个不可变对象(比如数字.字符或者元组)的引用,就不能直接修改原始对象--相当于通过"传值

python中a+=a和a=a+a的区别

+= 是 + 的一种升级版本, 具有能把执行后的结果再写回传递来的变量本身的功能, 可变变量自身有比不可变变量多一个魔法方法 _iadd_, += 操作调用 _iadd_方法,没有该方法时,再尝试调用_add_方法, 不可变变量没有_iadd_方法 举例: # a += b >>> a1 = range(3) >>> a2 = a1 >>> a2 += [3] >>> a1 [0, 1, 2, 3] >>> a2 [

使用C语言为python编写动态模块(2)--解析python中的对象如何在C语言中传递并返回

楔子 编写扩展模块,需要有python源码层面的知识,我们之前介绍了python中的对象.但是对于编写扩展模块来讲还远远不够,因为里面还需要有python中模块的知识,比如:如何创建一个模块.如何初始化python环境等等.因此我们还需要了解一些前奏的知识,如果你的python基础比较好的话,那么我相信你一定能看懂,当然我们一开始只是介绍一个大概,至于细节方面我们会在真正编写扩展模块的时候会说. 关于使用C为python编写扩展模块,我前面还有一篇博客,强烈建议先去看那篇博客,对你了解Pytho

Python学习笔记整理(三)Python中的动态类型简介

Python中只有一个赋值模型 一.缺少类型声明语句的情况 在Python中,类型是在运行过程中自动决定的,而不是通过代码声明.这意味着没有必要事声明变量.只要记住,这个概念实质上对变量,对象和它们之间的关系都适用.那么这个概念也容易理解并掌握. 1.变量,对象和引用 变量创建:一个变量,当代码第一次给它赋值时它就被创建了.之后的赋值将会改变已创建的变量名的值.Python在代码运行之前先检测变量名,可以当成是最初的赋值创建变量. 变量类型:变量永远不会有任何的它关联的类型信息或约束.类型的概念

Python中的可变参数和关键字参数

刚开始接触 python 的时候,对 python 中的 *wargs (可变参数) 和 **kwargs (关键字参数)的理解不是很透彻,看了一下 <Explore Python>一书,里面对这一部分的描述相对浅显易懂, 这里依据个人理解进行相关总结. 可变参数(*args) 对于可变参数可以联想到 C# 中的可变参数.可变参数是一个数量不确定的列表集合,可以是 list 类型,也可以是 tuple 类型 我们定义如下代码段: def add(*numbers): print(type(nu

python中的垃圾回收

python中垃圾回收 以引用计数为主,但解决不了循环引用,以隔代回收为辅 import gc class A(): def __init__(self): print('object born, id:%s' % str(hex(id(self)))) def f2(): while True: a1 = A() a2 = A() a1.t = a2 a2.t = a1 del a1 del a2 gc.disable() f2() 这和链表有些类似: 原文地址:https://www.cnb