1
wwwjfy 2013-06-11 15:03:26 +08:00 2
1. a, b = b, a
2. 函数返回值重新赋值 3. 包在字典或者列表之类的传引用的进去 具体情况具体分析 |
2
davidli OP |
3
wwwjfy 2013-06-11 16:00:27 +08:00
@davidli 没研究那么深
python本来就是支持这种多赋值的,也没有执行顺序的差别,不会出现那种错误... 其实a, b是(a, b), c = a, b ==> c = (a, b) 充其量算是语法糖,跟语言本质没什么关系 |
4
swulling 2013-06-11 16:06:14 +08:00 1
Python分可变对象和不可变对象,可变对象你是不能用swap()来修改其值得
|
5
swulling 2013-06-11 17:13:05 +08:00
突然发现回答写错了。。可变对象 ---> 不可变对象
不过应该都知道<_< |
6
ruoyu0088 2013-06-11 18:45:36 +08:00 2
a, b = b, a
这句执行时,先运行b, a, 得到一个tuple对象,然后由于等号左边有两个名字,因此又将tuple对象打开。相当于执行以下两句: t = b, a a, b = t |
7
firstway 2013-06-11 23:24:28 +08:00
我的理解是,lz对swap(a,b)只是一个举例,lz问题的核心(正如swulling所说)其实就是“可变对象和不可变对象”的理解。lz可以找找“可变对象和不可变对象”相关文章看看。
|
8
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] |
9
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) |