为什么python中的列表操作在函数范围之外运行?

peo*_*les 7 python scope list

在下面的python代码中,变量number被传递给函数addone,并且操作本地副本.数字的值保持不变.

def addone(num):
    num = num + 1
    print "function: added 1, now %d" % num

number = 5
print "Before:", number
addone(number)
print "After:", number
Run Code Online (Sandbox Code Playgroud)

输出:

Before: 5
function: added 1, now 6
After: 5
Run Code Online (Sandbox Code Playgroud)

但是,行为似乎与pop,append等列表操作不同.这有点让我感到困惑.所有列表操作是否全局运行?如果是这样,背后有什么特别的原因吗?

def pop_first(stuff):
    popped = stuff.pop(0)
    print "function: '%s' was popped!" % popped

words = ["A", "list", "of", "words"]
print "Before:", words
pop_first(words)
print "After:", words
Run Code Online (Sandbox Code Playgroud)

输出:

Before: ['A', 'list', 'of', 'words']
function: 'A' was popped!
After: ['list', 'of', 'words']
Run Code Online (Sandbox Code Playgroud)

Ale*_*ton 5

简而言之,因为列表是可变的,而整数是不可变的


您无法就地改变整数,因此我们将其称为“不可变”。考虑到这一点,诸如整数加法之类的事情不会修改原始对象,而是返回一个新值 - 因此您的原始变量将保持不变。因此,如果我们存储对整数的引用,只要我们没有更改其中任何一个,它们就只是同一个对象:

>>> foo = 1
>>> bar = foo
>>> foo is bar
True
>>> foo += 2
3
>>> foo
3
>>> bar
1
>>> foo is bar
False
Run Code Online (Sandbox Code Playgroud)

另一方面,列表是“可变的”(可以修改相同的对象引用),并且诸如就地pop()变异、更改原始对象之类的操作。list这也意味着,如果您编辑对可变对象(例如 a )的引用list,原始对象也会被更改:

>>> baz = [1, 2, 3, 4, 5]
>>> qux = baz
>>> qux is baz
True
>>> baz.pop()
5
>>> qux
[1, 2, 3, 4]
>>> baz
[1, 2, 3, 4]
>>> qux is baz
True
Run Code Online (Sandbox Code Playgroud)