鱼C论坛

 找回密码
 立即注册
查看: 855|回复: 15

[已解决]关于数值的交换问题

[复制链接]
发表于 2018-5-5 19:07:18 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
  1. a=2
  2. b=8
  3. def swap(a,b):
  4.     a,b=b,a
复制代码


如代码所示,想要a,b的值交换,为什么运行swap函数后a,b的值还是不变呢
最佳答案
2018-5-5 20:15:15
爱学习的小fish 发表于 2018-5-5 19:46
调用后a,b的值仍然没有改变
这应该是形参与实参的差异,不是太懂如何在函数中直接改变实参的值

基本上明白了:如下方式不会改变传入的参数,因为:swap()函数的参数 a,b 仅在函数本地作用域内有效

def swap(a,b):
        a,b = b,a

b = 100

def tmp(b):
        b = 99

tmp(b)

print(b) #还是100

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-5-5 19:22:42 | 显示全部楼层
加一句
  1. swap(a, b)
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-5-5 19:22:58 | 显示全部楼层
顶一完函数后要使用
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-5-5 19:25:54 | 显示全部楼层
函数没被调用
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-5-5 19:30:19 | 显示全部楼层
本帖最后由 thexiosi 于 2018-5-5 19:43 编辑

hi 原因并非是没有调用swap()函数
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-5-5 19:46:04 | 显示全部楼层
thexiosi 发表于 2018-5-5 19:30
hi 原因并非是没有调用swap()函数

调用后a,b的值仍然没有改变
这应该是形参与实参的差异,不是太懂如何在函数中直接改变实参的值
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-5-5 20:01:10 | 显示全部楼层
爱学习的小fish 发表于 2018-5-5 19:46
调用后a,b的值仍然没有改变
这应该是形参与实参的差异,不是太懂如何在函数中直接改变实参的值

恩 研究了一下,我也木有弄明白

目前来看,不使用函数,直接进行交换才能正常生效: a,b = b,a
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-5-5 20:15:15 | 显示全部楼层    本楼为最佳答案   
爱学习的小fish 发表于 2018-5-5 19:46
调用后a,b的值仍然没有改变
这应该是形参与实参的差异,不是太懂如何在函数中直接改变实参的值

基本上明白了:如下方式不会改变传入的参数,因为:swap()函数的参数 a,b 仅在函数本地作用域内有效

def swap(a,b):
        a,b = b,a

b = 100

def tmp(b):
        b = 99

tmp(b)

print(b) #还是100

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-5-5 20:27:55 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2018-5-5 20:28:00 | 显示全部楼层
thexiosi 发表于 2018-5-5 20:15
基本上明白了:如下方式不会改变传入的参数,因为:swap()函数的参数 a,b 仅在函数本地作用域内有效

d ...

Python参数传递采用的是“传对象引用”的方式。这种方式相当于传值和传引用的一种综合。如果函数收到的是一个可变对象(比如字典或者列表)的引用,就能修改对象的原始值--相当于通过“传引用”来传递对象。如果函数收到的是一个不可变对象(比如数字、字符或者元组)的引用,就不能直接修改原始对象--相当于通过“传值'来传递对象。
  1. a=2
  2. print('*',id(a)) #  * 4546557968
  3. def f1(x):
  4.     print('f1_x1',id(x)) #  f1_x1 4546557968
  5.     x=x+1
  6.     print('f1_x2',id(x)) #  f1_x2 4546558000
  7. f1(a)
  8. print('after',a) # after 2
复制代码

注意这时a的值没有变,id(a)指的是a在内存中的地址
  1. b=[1,2,3]
  2. print('*',id(b)) #  * 103692059976
  3. def f2(x):
  4.     print('f2_x1',id(x),x) #  f2_x1 103692059976 [1, 2, 3]
  5.     x[1]=100
  6.     print('f2_x2',id(x),x) #  f2_x2 103692059976 [1, 100, 3]
  7. f2(b)
  8. print('after',b) # after [1, 100, 3]
复制代码

注意这时b的值变了
  1. x=2
  2. y=8
  3. def swap(a,b):
  4.     a,b=b,a
  5.     return a,b
  6. x,y=swap(x,y) #x=8,y=2
复制代码

这样做可以把x,y的值换掉
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2018-5-5 20:34:31 | 显示全部楼层
爱学习的小fish 发表于 2018-5-5 20:28
Python参数传递采用的是“传对象引用”的方式。这种方式相当于传值和传引用的一种综合。如果函数收到的是 ...

恩 学习啦 :)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-5-5 20:45:43 | 显示全部楼层
外面的a,b是全局变量,而里面的a,b是局部变量。
只能在局部变量里面加进行输出
a = 1
b = 5
def swap(a,b):
    a,b = b,a
    print(a,b)
swap(a,b)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2018-5-5 20:47:13 | 显示全部楼层
a=2
b=8
def swap(a,b):
    return b,a
a,b=swap(a,b)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-5-5 20:47:34 | 显示全部楼层
这里调换跟swap没有半毛钱关系,因为你已经在内层函数里,进行了调换。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-5-6 09:52:28 | 显示全部楼层
爱学习的小fish 发表于 2018-5-5 20:28
Python参数传递采用的是“传对象引用”的方式。这种方式相当于传值和传引用的一种综合。如果函数收到的是 ...

我写的不能算最佳答案哈 , 楼主的10楼才是 :)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-5-6 12:47:46 | 显示全部楼层
thexiosi 发表于 2018-5-6 09:52
我写的不能算最佳答案哈 , 楼主的10楼才是 :)

哈哈,一起学习共同进步
跟你讨论给了我灵感
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-17 13:08

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表