Python:为什么引用列表的变量范围不同于引用任何其他数据结构或数据类型的变量?

标签 python python-2.7 python-3.x

我发现引用列表的变量的范围与引用元组、整数或字符串的变量的范围不同。为什么会这样?

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/

相关文章:

python - 共享轴 (twinx) 隐藏 y 轴值

python - 洗牌后的不同结果

python - 不带参数传递 Python 函数

python - 创建一个 python 单元测试,其中缺少模块是伪造的

django - 如何让 Gunicorn 使用 Python 3 而不是 Python 2(502 Bad Gateway)

python - 使用 python 将 CSV 文件上传到 Microsoft Azure 存储帐户

python - 如何将列表保存为带有新行的 CSV 文件?

python - PyQt4 和写入串行是否需要多线程

windows - Python - 在 Windows 中找不到 pip.ini 或 pip.conf

python - 使用 python - 仅从键 :value pairs in parsed JSON 中获取特定值