在可变和不可变对象的情况下,Python对象引用和变量之间的区别

问题描述 投票:-1回答:2

我正在读一本关于python的书:

一旦我们有了一些数据类型,我们需要的下一件事就是存储它们的变量。 Python没有这样的变量,而是具有对象引用。当谈到像int和strs这样的不可变对象时,变量和对象引用之间没有明显的区别。至于可变对象,则存在差异,但在实践中很少发生。“

现在没有提到有什么区别,我无法清楚自己这个概念。

什么是对象引用(是cpython的内存地址)?实际上什么是变量是一个绑定到对象引用的名称(我对内存引用的理解是,它是cpython内存中的一个地址,如果我错了就清楚我这个)。

如果能够根据它在C中的内部实现进行解释以及如何在内部管理和工作这将是有帮助的。

如果可以提供一些详细解释cpython实现的资源也会很有帮助。

python variables object cpython
2个回答
2
投票
  • 您可以参考此链接了解更多详情:How do I pass a variable by reference或者:https://www.python-course.eu/passing_arguments.php
  • 在C ++中,有3种方法将参数传递给函数
  • 按值传递:通常,变量的值将被复制并传递给函数,因此在函数更改其值后,该变量的值不会更改。在python中,如果传递一个不可变的变量(如int或strs),那些变量的值将不会改变。

例如:C ++

void passByValueFunction(int a)
{
    //Changing argument
    a = 20;
}
int main ()
{
    int a = 10;
    std::cout << a;
    passByValueFunction(a);
    //a will not change after passByValueFunction changes its value
    std::cout << a;  
}

来源:Python的

def passByValue(a):
    a = 20
a = 10
print a
passByValue(a)
# a will not change
print a

+通过地址传递并通过引用传递:C ++可以通过地址(通过指针)或通过引用(引用变量)传递。结果是变量的值在更改函数后会发生变化。在python中,如果将可变变量传递给函数,则其值将更改。

Ex: C++

    void passByRef(int &a)
    {
      a = 20
    }
    int main ()
    {
      a = 10;
      std::cout << a;
      passByRef(a);
      //The value of a will be change
      std::cout << a;
    }

来源:Python的

def passByRef(list):
  list = [22,33]
list = [11,44]
print list
passByRef(list)
#List will be change
print list

0
投票

作者说,当涉及到不可变对象时,你也可以忽略引用,因为你总是用对另一个这样的对象的引用来替换对intstr对象的引用。

所以

a = 5
a = a + 10

a设置为对新的int对象的引用。毕竟,你不能直接改变那个对象。

它们进一步区分变量和对象引用。 Python的名称(通常称为变量)不直接存储值(就像在C或其他语言中那样),它们总是引用。 a = 5使a引用了int类型的对象,其值为5,而在C中,它需要aint变量,它直接保存值。

我会发现这个解释也令人困惑,因为可变对象所发生的事情是它们本身包含你改变的引用。列表只是一系列引用,每个引用都由索引寻址。您可以通过添加更多引用(扩展列表)或通过更改引用(分配给索引)来改变列表。

我强烈建议你阅读Ned Batchelder's Facts and myths about Python names and values,这是对Python模型如何工作的更清晰的解释。

我不担心这在C中是如何实现的。 CPython只使用很多指针来构建内存堆上的对象。

© www.soinside.com 2019 - 2024. All rights reserved.