入门问题求解答~有关Python中函数传值的问题

2013-06-11 15:00:39 +08:00
 davidli
新人,一直在潜水,第一次提问。
以前学JAVA,又学了点JS,最近学Python.
了解到Python中函数如果要使用函数外某变量,那它只是将其值复制一份传入,而非直接将此变量引用。
这样, 如果我想用一个函数对函数外的值进行修改,应该怎么做?

比如 已有a=1, b=2,我想写一个swap(a,b), 让这两个数交换其值, 应该怎么写?

得知可以用global变量,但一是灵活性太差,二是感觉这么小的问题就用到了global,有点杀鸡用牛刀的意味。

所以请问在Python有没有比较合适的解决此问题的方法?
4104 次点击
所在节点    Python
11 条回复
wwwjfy
2013-06-11 15:03:26 +08:00
1. a, b = b, a

2. 函数返回值重新赋值

3. 包在字典或者列表之类的传引用的进去

具体情况具体分析
davidli
2013-06-11 15:08:29 +08:00
@wwwjfy
a,b = b,a !!!
还能这么用!!
用惯了JAVA死板的语法,一时半会适应不能
但请问这样为什么不会出现a =b, b=b的错误?
wwwjfy
2013-06-11 16:00:27 +08:00
@davidli 没研究那么深

python本来就是支持这种多赋值的,也没有执行顺序的差别,不会出现那种错误...

其实a, b是(a, b), c = a, b ==> c = (a, b)

充其量算是语法糖,跟语言本质没什么关系
swulling
2013-06-11 16:06:14 +08:00
Python分可变对象和不可变对象,可变对象你是不能用swap()来修改其值得
swulling
2013-06-11 17:13:05 +08:00
突然发现回答写错了。。可变对象 ---> 不可变对象

不过应该都知道<_<
ruoyu0088
2013-06-11 18:45:36 +08:00
a, b = b, a
这句执行时,先运行b, a, 得到一个tuple对象,然后由于等号左边有两个名字,因此又将tuple对象打开。相当于执行以下两句:
t = b, a
a, b = t
firstway
2013-06-11 23:24:28 +08:00
我的理解是,lz对swap(a,b)只是一个举例,lz问题的核心(正如swulling所说)其实就是“可变对象和不可变对象”的理解。lz可以找找“可变对象和不可变对象”相关文章看看。
firstway
2013-06-11 23:32:28 +08:00
对于不可变对象,比如数值类型,函数传递都是是值传递,也就是复制一份,函数内任何修改对函数外没有影响,除了global。
如果是可变对象,比如list,可以理解为引用传递,函数内的In-Place Changes就会修改引用本身的内容。比如:
def my_add(L):
L[0] = L[0]+100
a = [8,9,10]
my_add(a)
print(a) ## a = [108,9,10]
y0
2013-06-12 00:00:10 +08:00
“用一个函数对函数外的值进行修改” 这种行为本来就应该避免。
好的 “函数” 应该是不保存任何状态,每次运行结果都一样的。
运行结果不一样的,那叫指令而不是函数,需要保存状态的话用闭包。

你需要改变的是这种思路而不是找个办法修改外部的值。

实在有必要的话,让函数返回需要的值,再 unpack. 和 swap 类似。比如

def h(a,b,c):
....xxxxxxxxxxx
....xxxxxxxxxxx
....return new_a, new_b, new_c

a, b, c = h(a, b, c)
glasslion
2013-06-21 16:08:51 +08:00
@firstway 不可变对象还是应用传递,不会发生复制。
itfanr
2014-02-15 15:41:06 +08:00
楼主的疑惑和我想的也是完全一样,我通过以下的回复渐渐明白了。python是把数字上面挂变量标签,不是往变量盒子里面放数据,和C/JAVA完全不同的。

@y0 "用一个函数对函数外的值进行修改" C++等语言,只能传地址进去。。。。不过python就应该发挥它的长处

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/72031

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX