Python中的传值和引用

我写这个主要是给自己看,内容也就是便于自己理解,可能会不正确,但目前来看代码测试的结果是对的。

python中一切皆对象。

当我们赋值时: a = 1

其实是先创建了一个整数常量1(也是一个对象,且已经为它分配了内存),然后将它的地址传递给了a

当我们将a的值赋值给b时: b = a ,其实也是将1的地址传递给了b

接下来查看a和b的地址

id(a)
id(b)

会发现两者相同

所以如果执行 a = 2 ,a的地址就会改变,再执行 a = 1 之后,a的地址又会变成原来的值

而当操作自己定义的class类实例的时候

变量名亦是存储的地址,赋值与值的改变也是传递的地址,基本上都相当于引用,单纯的传值其实也是变相分配新内存。

比如执行

a = [1,2,3]
b = a[:2]
id(a)
id(b)

id(a)和id(b)就会相差甚远,因为在创建b的时候其实是将a的列表中的元素先切片切出来之后再分配一个新的内存空间给它,再将其地址传给b。

时间: 2024-12-29 12:45:41

Python中的传值和引用的相关文章

python中函数传值与传引用

python中函数整数,字符串,元组都是传值,函数中不会改变其值,其他的会在函数中改变其值 例如传列表: #-*-ecoding:UTF-8 -*- def fun(a):     a[0]="sss";     print a     print id(a)     return ; a=["a","b"]; fun(a); print a; print id(a) 列表中的值已经改变,但列表的地址没有改变

python基础(5):深入理解 python 中的赋值、引用、拷贝、作用域

在 python 中赋值语句总是建立对象的引用值,而不是复制对象.因此,python 变量更像是指针,而不是数据存储区域, 这点和大多数 OO 语言类似吧,比如 C++.java 等 ~ 1.先来看个问题吧: 在Python中,令values=[0,1,2];values[1]=values,为何结果是[0,[...],2]? >>> values = [0, 1, 2] >>> values[1] = values >>> values [0, [.

python中函数参数的引用方式

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

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.appe

Python参数传递(传值&传引用)

# 测试参数是传值还是传引用def test(arg): print("test before") print(id(arg)) arg[1]=30 # 测试可变对象 # arg[3][2] = 16 # 测试嵌套类型 # arg = list(range(5)) print("test after") print(id(arg)) return argchange_loc = 1if change_loc == 1: # 传入可变对象 my_list = list

java中函数传值与引用问题

从C++转java,在使用函数传对象时,碰到一点问题,今天特意验证了一下: public class App { public static void doubleTest(double d) { d=8.0; System.out.println( "[INNER doubleTest]double:"+d); } public static void DoubleTest(Double dd) { dd=8.0; System.out.println( "[INNER D

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

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

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

Python中只有一个赋值模型 一.缺少类型声明语句的情况 在Python中,类型是在运行过程中自动决定的,而不是通过代码声明.这意味着没有必要事声明变量.只要记住,这个概念实质上对变量,对象和它们之间的关系都适用.那么这个概念也容易理解并掌握. 1.变量,对象和引用 变量创建:一个变量,当代码第一次给它赋值时它就被创建了.之后的赋值将会改变已创建的变量名的值.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 [