设计网站公司有哪些,网站开发实训心得800字,服务器在国外未备案网站,网络口碑营销案例1. 传值与传址的区别
传值就是传入一个参数的值#xff0c;传址就是传入一个参数的地址#xff0c;也就是内存的地址#xff08;相当于指针#xff09;。他们的区别是如果函数里面对传入的参数重新赋值#xff0c;函数外的全局变量是否相应改变#xff1a;用传值传入的参…1. 传值与传址的区别
传值就是传入一个参数的值传址就是传入一个参数的地址也就是内存的地址相当于指针。他们的区别是如果函数里面对传入的参数重新赋值函数外的全局变量是否相应改变用传值传入的参数是不会改变的用传址传入就会。
defa(n):
n[2] 100
print(n)returnNonedefb(n):
n 100
print(n)returnNone
an [1,2,3,4,5]
bn 10
print(an)
a(an)print(an)print(bn)
b(bn)print(bn)
[1, 2, 3, 4, 5]
[1, 2, 100, 4, 5]
[1, 2, 100, 4, 5]10
110
10
在上面的例子中an是一个list将其作为实参传入函数a中a对其第三个元素进行修改。a执行结束后再次打印an发现里面的元素的确发生变化这就是传址操作。bn代表一个数字将其传入函数b并做修改b执行结束后再次打印bn没有变化这是传值操作。
2. Python中传值与传址的规律
Python是不允许程序员选择采用传值还是传址的。Python参数传递采用的是“传对象引用”的方式实际上这种方式相当于传值和传址的一种综合。
如果函数收到的是一个可变对象比如字典或者列表的引用就能修改对象的原始值——相当于传址。如果函数收到的是一个不可变对象比如数字、字符或者元组的引用就不能直接修改原始对象——相当于传值。所以python的传值和传址是根据传入参数的类型来选择的。
传值的参数类型数字字符串元组
传址的参数类型列表字典
3. 内置函数id
内置函数id负责显示一个变量或者数据在内存中的地址有时可以用来检测所使用的对象是否为同一个帮助区别传值与传址操作。
但是id在有些情况下比较特殊注意下面的例子。
a 100b 200
print(id(a))print(id(b))
caprint(id(c))print(a isc)
a 300
print(a)print(c)print(a isc)print(id(a))print(id(c))
1549495552
1549498752
1549495552True400
100False93638128
1549495552
为了提高内存利用效率对于一些简单的对象如一些数值较小的int对象python采取重用对象内存的办法。如指向a100c100时由于100作为简单的int类型且数值小python不会两次为其分配内存而是只分配一次然后将a与c同时指向已分配的对象。但是当a的值发生变化时会单独为a重新分配一个新的内存。
4. list传值与传址
list类型使用简单的赋值操作是传址。
a [1,2,3,4,5]
baprint(a)
b[2] 333
print(a)print(b)print(id(a))print(id(b))
[1, 2, 3, 4, 5]
[1, 2, 333, 4, 5]
[1, 2, 333, 4, 5]96142472
96142472
copy函数是浅拷贝是传值。python2中需要import copy模块python3可直接使用。
a [1,2,3,4,5]
ba.copy()print(a)
b[2] 333
print(a)print(b)print(id(a))print(id(b))
[1, 2, 3, 4, 5]
[1, 2, 3, 4, 5]
[1, 2, 333, 4, 5]92990536
96202632
由于copy是浅拷贝只拷贝一层的内容当遇到下列情况时copy不能实现完全的传值操作。
a [1,2,3,[10,20,30]]
ba.copy()print(id(a))print(id(b))print(id(a[3]))print(id(b[3]))
a[3][2] 666
print(a)print(b)
96141704
93355400
96141768
96141768[1, 2, 3, [10, 20, 666]]
[1, 2, 3, [10, 20, 666]]
要解决这个问题需要使用deepcopy。python3中直接可以使用copy方法但deepcopy还是需要导入copy模块。
importcopy
a [1,2,3,[10,20,30]]
bcopy.deepcopy(a)print(id(a))print(id(b))print(id(a[3]))print(id(b[3]))
a[3][2] 666
print(a)print(b)
96503944
93002376
96886024
93352712[1, 2, 3, [10, 20, 666]]
[1, 2, 3, [10, 20, 30]]
5. tuple操作
tuple元组是不可修改的指的是其元组内容不可改。
t1 (1,2,3)
t1[1] 100
---------------------------------------------------------------------------TypeError Traceback (most recent call last) in ()1 t1 (1,2,3)---- 2 t1[1] 100TypeError:tuple object does not support item assignment
但是其所指向的内存地址是可变的。
t1 (1,2,3)
t2 (5,6,7)print(id(t1))
t1t2print(t1)print(id(t1))print(id(t2))
t2* 3
print(t2)print(id(t2))
96151520(1, 2, 3, 5, 6, 7)93048552
94080672(5, 6, 7, 5, 6, 7, 5, 6, 7)93656912
并不是起初的t1和t2所指向的元组内容发生了变化而是新分配了两个元组内存t1和t2所指向的内存发生改变。