|
|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
请大家帮帮我
a = [10,3]
def xx(a):
a.append(5)
return a
b = xx(a)
print(a)
print(b)
输出结果为:a:[10, 3, 5] b: [10, 3, 5] 这里 a 在出函数之后也被改变了
a = 10
def xx(a):
a=5
return a
b = xx(a)
print(a)
print(b)
输出结果为:a:10 b: 5 这里 a 在出函数之后没有被改变
请问为什么会不一样呢?
谢谢大家
本帖最后由 小小大鱼 于 2016-2-29 22:36 编辑
关键列表的修改方法,与变量的修改方法不同
- # 修改下第一个函数的形式
- a = [10,3]
- def xx(a):
- a = [10,3,5] # 等价a.append(5)
- return a
- b = xx(a)
- print(a)
- print(b)
复制代码
从形式上,第一种形式与第二种形式一样。
第二种情况中,a没变的原因是:函数内变量a生命周期被限制在函数内,出了函数无效
说到修改的方式:
# python中变量都是引用
- a = 10 # a指向10,简单点说就是a是个标签,10是一个箱子,里面放了10块钱,a贴在箱子上,但出了函数,标签会被回收
- def xx(a):
- a = 5 # 在函数内部生命周期内, 会在另一块内存创建一个变量a指向5,但这块内存出了函数会被回收
- return a
- b = xx(a) #b引用了函数内部的a的值5
- print(a) #此时只剩下开始时的变量a 指向10
- print(b)
复制代码
但是列表 [10,3]的修改方式不一样,它不会另外创建一个a列表,并将其内容改成[10,3,5],而是直接在a列表的[10,3]基础上直接改,即将箱子里面的钱改了[10,3,5],再把标签贴上去
2是给你2个标签,给你2个箱子,其中一个标签和5块钱只给你看看,就收回去了,1是给你一个标签,但给了1个箱子,并向箱子里面加了5块钱
#为了说明这两种不同的修改方式,下面看下,修改前后变量的内存地址:
- >>> a = [1,2] # a为列表,修改前后,内存地址没变,即在原地修改
- >>> id(a)
- 1154044707848
- >>> a.append(3)
- >>> a
- [1, 2, 3]
- >>> id(a)
- 1154044707848
- >>> b =10 #b修改前后内存地址改变了
- >>> id(b)
- 1421922320
- >>> b = 5
- >>> id(b)
- 1421922160
- >>>
复制代码
写完感觉快把自己搞晕了,也不知道讲明白没有
|
|