开发者学堂课程【Python 入门 2020年版:可变类型和不可变类型的传参】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/639/detail/10336
可变类型和不可变类型的传参
内容介绍:
一、可变类型和不可变类型的传参
一、可变类型和不可变类型的传参
def test(a ) :
a = 100
def demo(nums ) :
nums[o] = 10
x = 1
test(x)
p
rint(X)
运行结果:1
y = [3,5,6,8,2]
demo(y)
p
rint(y)
运行结果:[10,5,6,8,2]
X 传给 a,大方框是一个大内存,有一个地方保存了数据是1,a=1,
不对,先是 x=1,a 也指向1,同时指向1的这块内存空间,1具有地址,a 想要修改1上的地址数据,之前讲过,int 类型的数据不允许修改,不可变类型要是修改,会发生一种新的情况,会产生一个新的内存空间,内存空间存储的是100,a 再指向100,这就是内存地址的传递情况,如下图所示。
def test(a):
('修改前 a 的内存地址 ex%’% id(a))
a = 100
print('修改
后
a的内存地址ex%’% id(a))
def demo( nums ) :
nums[0] = 10
x=1
print('
调用前
x 的内存地址 ex%’% id(
x
))
t
est(x)
print('
调用后 x
的内存地址 ex%’% id(
x
))
print(x)
运行结果:
调用前 x 的内存地址 O×7FFBC4617110
修改前 a 的内存地址 Ox7FFBC4617110
修改后 a 的内存地址 Ox7FFBC4617D70
调用后 x 的内存地址 Ox7FFBC4617110
1
[10,5,6,8,2]
Def demo
‘(n
ums)
Print('修改前 nums 的内存地址0x%’% id(nums))
Nums[0]
=10
Print('修改
后
nums 的内存地址0x%’% id(nums))
Y=[3,5,6,8,2]
print('
调用前
y
的
内存地址0x%’% id(
y
))
demo(y)
print('
调用后
y的内存地址0x%’% id(y))
print(y)
列表是一个可变的数据类型,y 指向内存空间,demo(y)会将 y 传递给 nums,即nums=y,nums 指向 y,将第零个数据修改成10以后,打印 y 之后数据就会改变,如下图所示。
运行结果:
调用前 y 的内存地址0x12445E65208
修改前 nums 的内存地址 Ox12445E65208
修改后 nums 的内存地址0x12445E65208
调用后 y 的内存地址 Ox12445E65208
[10, 5,6,8,2]
四个内存地址都是相同的。
如果还是不清楚可以 crtlC 复制代码到网站:
www.pythontutor.com,有个动态效果图可以查看,可以剪切刚才的代码来查看,这个网站国内可以访问,删掉打印的东西,
可以运行 next 的下一步,x=1,a=1,运行完之后 a=100,
查看 y,nums 也指向这个空间,
修改 nums 之后,y 的第零个数据就改了,