【发布时间】:2017-12-25 05:11:41
【问题描述】:
请看下面的代码
def double(arg):
print("Before: ", arg)
arg = arg * 2
print("After: ", arg)
我在学习 Head first Python,我来到了这个部分,他们正在讨论按值传递和按引用传递。 如果我们使用列表作为参数调用上述函数,例如:
num = [1,2,3]
double(num)
print(num)
输出是:-
Before: [1, 2, 3]
After: [1, 2, 3, 1, 2, 3]
[1, 2, 3]
这看起来不错,考虑到函数 double 中的 arg 是一个新的对象引用这一事实。所以 num 的值没有改变。
但是,如果我使用复合运算符而不是赋值运算符,事情的工作方式会有所不同,如下所示:
def double(arg):
print("Before: ", arg)
arg *= 2
print("After: ", arg)
num = [1,2,3]
double(num)
print(num)
我得到的输出是:
Before: [1, 2, 3]
After: [1, 2, 3, 1, 2, 3]
[1, 2, 3, 1, 2, 3]
为什么会这样?我曾经认为 a*=2 和 a = a*2 是一样的。但是这里发生了什么?
谢谢
【问题讨论】:
标签: python python-3.x