【发布时间】:2012-04-23 02:25:52
【问题描述】:
可能重复:
Understanding Python's call-by-object style of passing function arguments
我最近遇到了这个:
x = [1,2,3]
def change_1(x):
x = x.remove(x[0])
return x
结果:
>>> change_1(x)
>>> x
[2, 3]
我发现这种行为令人惊讶,因为我认为函数内部的任何内容都不会影响外部变量。此外,我构建了一个示例,它基本上做同样的事情,但没有使用remove:
x = [1,2,3]
def change_2(x):
x = x[1:]
return x
结果:
>>> change_2(x)
[2, 3] # Also the output prints out here not sure why this is
>>> x
[1, 2, 3]
我得到了我期望的结果,函数并没有改变 x。
所以必须是 remove 特定的东西才有效。这是怎么回事?
【问题讨论】:
-
Python tutorial 4.6,第 6 段(另请参阅脚注)。这些东西实际上在教程中都有说明。
-
您认为
x.remove(x[0])会返回什么值?它实际上返回什么?改变对象和将现有名称重新绑定到新创建的对象有什么区别? -
也许,一个让你看一些例子,做一些练习来完全掌握语言工作原理的好地方是learnpythonthehardway.org
-
很明显,Akavall 了解局部变量以及将列表传递给函数的语义。 (为什么每个人都认为他没有!)。他基本上已经为自己回答了这个问题:他的怀疑是正确的:这是
remove特有的东西。remove是一种破坏性操作(它会改变对象)。切片提取没有破坏性;它计算一个与原始列表类似的新列表,但删除了部分。就是这样。