我发现引用列表的变量的范围与引用元组、整数或字符串的变量的范围不同。为什么会这样?
1) 当我使用整数、字符串或元组时:-
>>> def foo(anInt, aStr, aTup):
anInt += 5
aStr += ' hi'
aTup += (12,)
print (anInt,aStr,aTup)
>>> anInt, aStr, aTup = 5, 'Fox', (11,)
>>> foo(anInt, aStr, aTup)
10 Fox hi (11, 12)
>>> print (anInt, aStr, aTup)
5 Fox (11,)
2) 当我使用列表时:-
>>> def foo(aList):
aList.append(2)
print (aList)
>>> aList = [1]
>>> foo(aList)
[1, 2]
>>> print (aList)
[1, 2]
在第一种情况下,anInt、aStr、aTup 的值变化仅限于函数范围,而在 List 范围变化的情况下。
'
最佳答案
这不是范围问题。范围在类型之间没有区别。事实上,它没有区别:变量只是对值的命名引用,完全与类型无关。
但 Python 中的某些类型是可变的(一旦创建,值就可以更改),list
就是其中之一。有些是不可变的,更改这些类型的值需要创建一个新对象。 +=
对于可变类型和不可变类型以两种不同的方式工作。对于不可变类型,a += b
等同于 a = a + b
。创建了一个新对象,a
变量现在引用它。但是可变类型的对象是“就地”修改的,就像您的列表一样。您可能想阅读 this .
现在让我们来看看作用域。这里有传递给函数的全局对象。该函数将它们用作其参数,而不是全局对象(是的,函数内部的 aList
与外部的 aList
不是同一个变量,here 是关于范围)。它使用对相同对象的其他引用,并且它不能修改变量,它只能修改变量引用的对象。但只有可变对象。
如果比较以下两个代码示例的结果,您可能会感到惊讶。
>>> a = 1; a1 = a; a1 += 1; a
1
>>> a = [1]; a1 = a; a1 += [1]; a
[1, 1]
有什么区别?唯一的区别是 int
是不可变类型,而 list
是可变类型。在将 a
分配给 a1
之后,它们总是引用一个对象。但是 +=
运算符在 int
的情况下创建一个新对象。
关于Python:为什么引用列表的变量范围不同于引用任何其他数据结构或数据类型的变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43247452/